Select 行符合多个 and/or 条件

Select rows that matches multiple and/or conditions

所以我创建了一个 sql fiddle 来更清楚地解释我的问题:

http://sqlfiddle.com/#!9/3122282/1

如您所见,我有 3 个表,其中 1 个链接另外 2 个。

如果我说“给我产品(绿色或红色)和 PET(狗)”,我想做到这一点?

我试过:

select `ptl`.`product_id` 
from `tags` inner join `tags` as `ptl` 
on `tags`.`id` = `ptl`.`tag_id`
where ((`tags`.`tag` = "color" and `tags.value` in ("green", "red")) 
   or (`tags`.`tag` = "pet" and `tags.value` in ("dog"))) 
having count(distinct `ptl.tag_id`) = 2

// 在这种情况下,2 是标签“类别”的数量。

但这似乎不起作用。由于 having 只是检查计数,它还会 return 带有 2 个颜色标签且没有任何宠物的产品。

您没有将标签 table 加入 product_tags_link 和产品。 以此查询为基础,在where子句

上加上条件
select *
from products p
inner join product_tags_link ptl on ptl.product_id = p.id
inner join tags t on t.id = ptl.tag_id
where CONDITIONS

一个可以作为例子的条件

p.id = 1 and t.tag = 'color' and t.value = 'green'

您可以连接 3 个表,按产品分组并在 HAVING 子句中设置条件:

SELECT p.id, p.name
FROM products p 
INNER JOIN product_tags_link pt ON pt.product_id = p.id
INNER JOIN tags t ON pt.tag_id = t.id
GROUP BY p.id, p.name
HAVING SUM(t.tag = 'color' AND t.value IN ('green', 'red')) > 0
   AND SUM(t.tag = 'pet' AND t.value IN ('dog')) > 0

参见demo