选择数据透视表中的 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 删除数据透视表中的单行

Laravel Lucid whereHas 按数据透视表中的最新列

在另一个表 Laravel 中查找具有数据透视表中所有 id 的记录

在 Laravel 的数据透视表中添加 id 列有啥好处?