首页 > 解决方案 > 使用多个条件从多对多关联实体中选择实体

问题描述

我在选择具有两个或多个类别的产品类型的实体时遇到问题。

我有以下表格:

product
============
product_id (PK)
name

category
============
category_id (PK)
name

及其关联:

product_category
============
product_id (PFK)
category_id (PFK)

现在的问题是,我无法使用 product_category 表根据多个 category.category_id 选择产品。

例如:我想选择类别 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;

这显然是不可能的匹配,但我该如何解决这个问题?这甚至可能吗?

标签: mysqlsqldatabase

解决方案


加入一个派生表,您可以在其中过滤所有关联是否属于任一所需类别。然后按产品分组并使用一个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;

推荐阅读