Вы бы хотя бы структуру таблиц писали. В режиме телепата могу предположить что
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))
Этот запрос не будет использовать индексы, но зато наиболее читаем)