作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在筛选给定特性(一个)的买家(许多),主要条件为
buyers.bathroom_exact='1'
),请将其与特性的浴室值(value)相匹配。 买家可以选择多个精确的浴室搭配。这是一个示例架构:
CREATE TABLE `buyers` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`bathroomreq` tinyint(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `buyers_bathrooms` (
`buyer_id` int(10) unsigned NOT NULL DEFAULT '0',
`number` decimal(10,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `buyers` ( name, bathroomreq ) VALUES ( 'John Doe', 1);
INSERT INTO `buyers` ( name, bathroomreq ) VALUES ( 'John Smith', 1);
INSERT INTO buyers_bathrooms ( buyer_id, number ) VALUES ( 1, 8 );
INSERT INTO buyers_bathrooms ( buyer_id, number ) VALUES ( 1, 9 );
INSERT INTO buyers_bathrooms ( buyer_id, number ) VALUES ( 1, 10 );
INSERT INTO buyers_bathrooms ( buyer_id, number ) VALUES ( 2, 5 );
我能想到的唯一方法是使用具有 IF
子句的列来查看 Bathroomreq 是否为 1
,然后匹配买家的 group_concat指定浴室:
SELECT IF ( bathroomreq = '1', 8 IN (
SELECT GROUP_CONCAT(number) AS bathrooms
FROM buyers_bathrooms
WHERE buyers.id = buyers_bathrooms.buyer_id
) , 1 ) AS bathroom_match,
bathroomreq,
id, name
FROM buyers
所以这个属性基本上有 8 个浴室,这就是为什么 8 是硬编码在那里的。
这是一个 mysql fiddle :
http://sqlfiddle.com/#!2/508cc/1
这是解决问题的唯一方法吗?可靠吗?如果 bathroomreq
是 1
,我可以用动态 INNER JOIN
之类的替代方法来实现吗?基本上,我是否可以避免在应用程序代码中基于 bathroom_match
进行分支,并仅通过 SQL 优雅地过滤它?
最佳答案
我认为你可以使用 exists
子句做你想做的事:
select b.bathroomreq, b.id, b.name,
(b.bathroomreq <> 1 or
exists (select 1
from buyers_bathrooms bb
where bb.buyer_id = b.id and bb.number = 8
)
) as bathroom_match
from buyers b;
关于mysql - 带有 GROUP_CONCAT 的动态 IN+IF 子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26476672/
我是一名优秀的程序员,十分优秀!