我在选择产品具有两个或更多类别的产品类型时遇到麻烦。
我有下表:
product
============
product_id (PK)
name
category
============
category_id (PK)
name
及其关联:
product_category
============
product_id (PFK)
category_id (PFK)
现在的问题是,我无法根据多个类别选择产品。category_id使用product_category表。
例如:我要选择所有类别均为1、2的产品,这意味着表product_category中出现了两次。
要选择所有具有单个类别的产品,可以使用以下选择
SELECT p.*
FROM product p
JOIN product_category pc using(product_id)
WHERE category_id = 1;
但是,如何选择产品具有category_id 1和2的位置? 查询应仅返回两个类别都关联的产品。
WHERE category_id = 1 and category_id = 2;
这显然是不可能的比赛,但是我该如何解决呢?那有可能吗?
答案 0 :(得分:1)
加入一个派生表,在其中过滤所有关联以使其属于所需类别之一。然后按产品分组并使用HAVING
子句,该子句检查类别的不同数量是否等于所需类别的数量。具有所有所需类别的产品将满足此要求。
SELECT p.*
FROM product p
INNER JOIN (SELECT pc.product_id
FROM product_category pc
WHERE pc.category_id IN (1, 2)
GROUP BY pc.product_id
HAVING count(DISTINCT pc.category_id) = 2)
ON pc.product_id = p.product_id;