SQL - 查找仅包含特定商品的订单

SQL - Finding Orders with only specific items

我想找出包含一种或多种产品的订单:A、B、C。

预期结果是:

order_id
101              (explanation: product A, B, C)
103              (explanation: product A)
106              (explanation: product A, B)
107              (explanation: product B)

订单

id deleted_at
101
102
103
104
105 5-5-2021
106
107

Order_items

id order_id 产品
1 101 一个
2 101 一个
3 101 B
4 101 C
5 102 一个
6 102 D
7 103 一个
8 104 D
9 105 D
10 105 B
11 106 一个
12 106 B
13 107 B
14 107 B
15 107 B

我试过这样写代码,但它仍然包含其他不相关的命令。

select Orders.id
from Orders left join Order_items on Orders.id=Order_items.order_id
where Orders.deleted_at is null
group by Orders.id
having count(distinct(case 
when Order_items.product=A then 1
when Order_items.product=B then 1
when Order_items.product=C then 1 end)) between 1 and 3;

您可以数一下不是 A、B 或 C 的产品,并确保其中 none 个按以下顺序排列:

select o.id
from Orders o join
     Order_items oi
     on o.id = oi.order_id
where o.deleted_at is null
group by o.id
having sum( oi.product not in ('A', 'B', 'C') ) = 0;

请注意,这使用 MySQL 的便利 shorthand 来计算布尔匹配。

只检查它们是否存在,不需要连接。

SELECT
    id
FROM
    orders o
WHERE
    EXISTS (
        SELECT
            NULL
        FROM
            order_items oi
        WHERE
            oi.order_id = o.id
            AND oi.product IN (
                'A',
                'B',
                'C'
            )
    )