【问题标题】:How to find if a list/set is exactly within another list如何查找列表/集合是否恰好在另一个列表中
【发布时间】:2020-10-31 12:15:29
【问题描述】:

我的问题基本上是这个问题的延伸——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

我想查找具有完全给定产品 ID 的订单。

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

【问题讨论】:

  • "接受的答案将导致 order_id = 2" 但 order_id=2 有 3 个product_id ......?
  • 所引用问题的接受答案输出订单 ID 1 和订单 2。订单 ID 2,在我的场景中不需要,因为它是产品 ID 的完全匹配。
  • order_id=2 不完全匹配。它有 3 种产品,而您似乎正在寻找 2 种产品。这使问题变得不清楚,这使人们使用“不清楚”选项(这是一个否决)

标签: mysql sql rdbms


【解决方案1】:

您仍然可以使用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 速记,其中布尔表达式被视为数字,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 ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-22
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多