如何查找 list/set 是否正好在另一个列表中

How to find if a list/set is exactly within another list

我的问题基本上是这个问题的延伸 - How to find if a list/set is contained within another list

我有相同的数据,但有更多完全相同的产品 -

order_id | product_id
----------------------
1        | 222
1        | 555
2        | 333
2        | 222
2        | 555

我想找到订单 EXACTLY 给定的产品 ID。

例如:如果我搜索 222 和 555,我应该得到 order_id 1 作为输出,因为它只有这 2 个确切的产品 ID。并且不应将订单 ID 2 作为输出,因为它有一个额外的 333 产品 ID。

您仍然可以使用 having,但要针对每个产品进行测试 -- 以及是否缺少任何其他产品:

SELECT o.order_id
FROM orders o
GROUP BY o.order_id
HAVING SUM( product_id = 222 ) > 0 AND
       SUM( product_id = 555 ) > 0 AND
       SUM( product_id NOT IN (222, 555) ) = 0 ;

请注意,这使用 MySQL shorthand,其中布尔表达式被视为数字,1 表示真,0 表示假。标准语法是:

HAVING SUM( CASE WHEN product_id = 222 THEN 1 ELSE 0 END) > 0 AND
       SUM( CASE WHEN product_id = 555 THEN 1 ELSE 0 END ) > 0 AND
       SUM( CASE WHEN product_id NOT IN (222, 555) THEN 1 ELSE 0 END ) = 0 ;