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。
所以我创建了一个 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。