【问题标题】:Select rows that matches multiple and/or conditions选择匹配多个和/或条件的行
【发布时间】:2021-10-25 19:17:15
【问题描述】:

所以我创建了一个 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 在这种情况下是标签“类别”的数量。

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

【问题讨论】:

  • 您能否真正分享在您发送的小提琴链接上运行的查询

标签: mysql sql subquery having where-in


【解决方案1】:

您没有将标签表与 product_tags_link 和 products 连接起来。 以此查询为基础,在 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'

【讨论】:

  • 你会如何写条件:“给我产品是(绿色或红色)和 PET(狗)”?
【解决方案2】:

您可以加入 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    相关资源
    最近更新 更多