mysql - 使用多个条件从多对多关联实体中选择实体
问题描述
我在选择具有两个或多个类别的产品类型的实体时遇到问题。
我有以下表格:
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;
推荐阅读
- angular - HTTP响应以角度打印为[object Object],[object Object]
- python - 值错误:使用序列数据预处理设置数组元素
- reactjs - 我可以在非渲染组件中使用 use* 函数(useState、useRef、useContext)吗?
- r - 单击 R Shiny 中的不同按钮后,在同一框中显示表格或图表
- python - Minecraft 服务器 .jar 使用子进程通过 python 脚本控制槽
- android - `postProcessing` 块不能与`setMinifyEnabled` 方法一起使用
- java - 如何将 JTable 单元格值从 A 类返回到 B 类
- c# - 如何在asp.net mvc中区分普通用户和管理员
- node.js - 使用 exceljs 同步读取 Excel 文件
- r - 如何使用 R 批量获取数据