使用多对多关联实体中的多个条件选择实体

时间:2019-04-24 21:41:43

标签: mysql sql database

我在选择产品具有两个或更多类别的产品类型时遇到麻烦。

我有下表:

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;

这显然是不可能的比赛,但是我该如何解决呢?那有可能吗?

1 个答案:

答案 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;