我有以下标准的多对多关系: http://sqlfiddle.com/#!9/43bd68/28/0
(简化版) - 我有产品1,它有类别1,2,3和产品2,类别为1,3。
我想要实现的是选择属于特定类别组合的产品。
说明一下:
类别应该像"过滤器" - 这就是为什么我最初的想法是设置WHERE category IN (1, 2) AND category IN (3)
,但这不起作用,因为类别是一行的单个值。我想我需要类似" foreach产品然后在产品内部检查它是否有类别(1或2)并且有类别(3)"。
是否可以通过SQL查询实现此目的?
答案 0 :(得分:1)
您可以使用如下查询:
SELECT
p.name as prodName, p.id as pid
FROM
Product p
JOIN Category_Product cp ON p.id = cp.product_id
JOIN Category c ON c.id = cp.category_id
WHERE category_id IN (2,3)
GROUP BY pid
HAVING COUNT(*) = 2
要为第一种情况实现查询,您必须在HAVING
子句中使用条件聚合:
SELECT
p.name as prodName, p.id as pid
FROM
Product p
JOIN Category_Product cp ON p.id = cp.product_id
JOIN Category c ON c.id = cp.category_id
WHERE category_id IN (1,2,3)
GROUP BY pid
HAVING COUNT(CASE WHEN category_id IN (1,2) THEN 1 END) > 0 AND
COUNT(CASE WHEN category_id = 3 THEN 1 END) >= 1