mysql - 选择数据透视表中的 ID,包括多个数据透视 ID,不包括一个数据透视 ID
问题描述
如何选择属于两个类别的产品并删除一个类别?
示例:我希望只选择属于第一类和第二类的产品,不包括第三类。
产品必须同时具有第一类和第二类。
如果产品具有类别一、二和三,则排除在外。
我试图做这样的事情,但它不起作用:
SELECT products.product_id , products.product_name FROM products
INNER JOIN product_category_relations ON product_category_relations.relations_product_id = products.product_id
WHERE relations_category_id IN (1,2) AND relations_category_id NOT IN (3)
GROUP BY products.product_id
选择的 Product_id:1 和 2。
示例产品表
product_id | 产品名称 |
---|---|
1 | T恤 |
2 | 裤子 |
3 | 比基尼 |
4 | 跳线 |
示例类别表
类别ID | 分类名称 |
---|---|
1 | 第一类 |
2 | 第二类 |
3 | 第三类 |
4 | 第四类 |
透视 product_category_relations 表
关系类别ID | 关系产品ID |
---|---|
1 | 1 |
2 | 1 |
4 | 1 |
1 | 2 |
2 | 2 |
1 | 3 |
2 | 3 |
3 | 3 |
1 | 4 |
4 | 4 |
解决方案
在WHERE
子句中包括所有 3 类,并使用HAVING
子句排除第 3 类:
SELECT p.product_id , p.product_name
FROM products p INNER JOIN product_category_relations pcr
ON pcr.relations_product_id = p.product_id
WHERE pcr.relations_category_id IN (1, 2, 3)
GROUP BY p.product_id
HAVING COUNT(*) = 2 -- only 2 categories are allowed
AND SUM(pcr.relations_category_id = 3) = 0 -- exclude category 3
或者,用 简化HAVING
子句GROUP_CONCAT()
:
HAVING GROUP_CONCAT(pcr.relations_category_id ORDER BY pcr.relations_category_id) = '1,2'
推荐阅读
- java - Springboot:需要在 Web-Server 启动时被通知/通知
- angular - 订阅 Angular 反应形式的输入错误
- python - 获取文件创建日期列表并连接熊猫数据框
- video.js - videojs-thumbnails 插件在不正确的时间显示缩略图
- firebase - 如何将 Firebase 控制台与使用 GCP 控制台创建的数据库一起使用?
- matlab - 用于 Fortran 的 mex 网关中 REAL 变量的可移植声明
- javascript - 如何避免通过获取进行另一个网络请求?
- java - 通过正则表达式删除空键
- kubernetes - 在 GKE 容器中存储文件的位置?
- spring-boot - 如何在任意方法名称上使用的 @Timed 注释中包含方法参数