选择数据透视表中的 ID,包括多个数据透视 ID,不包括一个数据透视 ID
Posted
技术标签:
【中文标题】选择数据透视表中的 ID,包括多个数据透视 ID,不包括一个数据透视 ID【英文标题】:Select IDs in pivot table including multiple pivot ID and excluding one pivot ID 【发布时间】:2021-10-20 02:26:05 【问题描述】:如何选择属于两个类别的产品并删除一个类别?
示例:我希望只选择属于第一类和第二类的产品,不包括第三类。
产品必须同时具有第一类和第二类。
如果产品有类别一、二和三,则排除。
我试图做这样的事情,但它不起作用:
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
已选择产品 ID:1 和 2。
示例产品表
product_id | product_name |
---|---|
1 | tshirt |
2 | pants |
3 | Bikini |
4 | Jumper |
类别表示例
category_id | category_name |
---|---|
1 | category one |
2 | category two |
3 | category three |
4 | category four |
透视 product_category_relations 表
relations_category_id | relations_product_id |
---|---|
1 | 1 |
2 | 1 |
4 | 1 |
1 | 2 |
2 | 2 |
1 | 3 |
2 | 3 |
3 | 3 |
1 | 4 |
4 | 4 |
【问题讨论】:
【参考方案1】:在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
或者,用GROUP_CONCAT()
简化HAVING
子句:
HAVING GROUP_CONCAT(pcr.relations_category_id ORDER BY pcr.relations_category_id) = '1,2'
【讨论】:
以上是关于选择数据透视表中的 ID,包括多个数据透视 ID,不包括一个数据透视 ID的主要内容,如果未能解决你的问题,请参考以下文章
如何在 laravel 中使用数据透视表中的 3 个关系创建关系?
Laravel 在数据透视表中为克隆字段的一个关系 ID 插入多行
Laravel Lucid whereHas 按数据透视表中的最新列