@bernex

Как получить заказы с определенным товаром через SQL?

Есть таблица с заказами(orders) и таблица с товарами заказа(order_positions).

Как получить список заказов, где есть товар 2 и больше нет никаких других товаров?
Как получить список заказов, где есть товар 2 и есть другой товар 3?
Как получить список заказов, где есть товар 2 и есть другой товар 3 или 4?

Как правильно подойти в задаче? Спасибо!
  • Вопрос задан
  • 1236 просмотров
Пригласить эксперта
Ответы на вопрос 1
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Вы бы хотя бы структуру таблиц писали. В режиме телепата могу предположить что
order_positions имеет поля order_id, good_id и хочется верить что это уникальный ключ.
Тогда вот так:

Как получить список заказов, где есть товар 2 и больше нет никаких других товаров?

select order_id from order_positions
group by order_id
having count(good_id) = 1 and good_id = 2

* это говнокодный запрос с неявным поведением, но в mysql он как правило будет работать.
см https://dev.mysql.com/doc/refman/5.0/en/sql-mode.h...

Как получить список заказов, где есть товар 2 и есть другой товар 3?

select order_id from order_positions where 
good_id IN (2,3)
group by order_id
having count(good_id) = 2


Как получить список заказов, где есть товар 2 и есть другой товар 3 или 4?

select order_id from order_positions where 
good_id IN (2,3)
group by order_id
having count(good_id) = 2
union
select order_id from order_positions where 
good_id IN (2,4)
group by order_id
having count(good_id) = 2


UPD
как выбрать заказы с good_id = 2, но чтобы не было good_id = 3 и 4?

В самом общем виде можно писать
select * from order 
where 
order_id IN (select order_id from order_position WHERE good_id = 2)
AND
order_id NOT IN (select order_id from order_position WHERE good_id in (3,4))

Этот запрос не будет использовать индексы, но зато наиболее читаем)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы