mysql - 使用多个条件从多对多关联实体中选择实体

标签 mysql sql database

我在选择“产品”类型的实体时遇到问题,其中产品有两个或多个类别。

我有以下表格:

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;

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

最佳答案

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

关于mysql - 使用多个条件从多对多关联实体中选择实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55838971/

相关文章:

来自不同数据库的 MySQL LEFT JOIN 2 查询

Flash Builder 移动应用程序中的数据库(Action Script 3.0)

java - 如何使用带有 JBOSS 工具的 Hibernate 在数据库中添加新记录?

php - 将 json 文件中的 blob 数据发送到 android 应用程序

php - MYSQL - 连接 1 个表或另一个表,具体取决于是否存在匹配项

php - 根据 Doctrine 中的条件更新某些字段

sql - 微软 SQL : What is the easiest/nicest way to create a linked server with SSMS?

sql-server - 源代码管理中的存储过程/DB 模式

mysql - 无法解释是什么让我的查询如此缓慢

MySQL 区间变量和子查询符号