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'
)
)
我想找出包含一种或多种产品的订单: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'
)
)