首页 > 解决方案 > 选择数据透视表中的 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

标签: mysqlsqlgroup-bycounthaving

解决方案


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'

推荐阅读