SQL — поиск заказов только с определенными элементами

Я хотел бы узнать заказы, которые содержат один или несколько продуктов: 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 null
102 null
103 null
104 null
105 5-5-2021
106 null
107 null

Order_items

id order_id product
1 101 A
2 101 A
3 101 B
4 101 C
5 102 A
6 102 D
7 103 A
8 104 D
9 105 D
10 105 B
11 106 A
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;

person uyeahu    schedule 09.06.2021    source источник


Ответы (2)


Вы можете подсчитать продукты, которые не относятся к A, B или C, и убедиться, что ни один из них не находится в порядке:

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 для подсчета логических совпадений.

person Gordon Linoff    schedule 09.06.2021
comment
Благодарю вас! оно работает!!!! Но у меня есть еще вопрос по этому поводу. Как я могу представить его по продуктам? Ожидаемый результат – продажи продукции A 3 B 3 C 1 - person uyeahu; 10.06.2021
comment
@uyeahu . . . Это не тот вопрос, который вы задали здесь. Если у вас есть другой вопрос, задайте новый вопрос. - person Gordon Linoff; 10.06.2021

Просто проверьте, существуют ли они, соединения не требуются.

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'
            )
    )
person banana_99    schedule 09.06.2021
comment
Благодарю вас! оно работает!!!! Но у меня есть еще вопрос по этому поводу. Как я могу представить его по продуктам? Ожидаемый результат – продажи продукции A 3 B 3 C 1 - person uyeahu; 10.06.2021
comment
Не могли бы вы отредактировать свой вопрос, показав ожидаемый результат и чем он отличается от исходного вопроса? Не совсем понятно с новыми требованиями. - person banana_99; 10.06.2021
comment
stackoverflow.com/questions/67923825/ - person uyeahu; 11.06.2021