Есть 3 таблицы (классика many2many):
Items
(id, name, price)
Orders
(id, time)
OrderItems
(order_id, item_id, count)
Выборка по дизъюнкции (список заказов, содержащих хотя бы один из элементов) работает так:
SELECT * FROM Orders o
JOIN OrderItems i ON i.order_id = o.id
WHERE i.item_id IN (1, 2, 3)
GROUP BY o.id;
А как выбрать те заказы из
Orders, которые содержат все заданные элементы (1, 2, 3)?
Без кривых подзапросов типа
(
SELECT COUNT(DISTINCT oi.item_id)
FROM OrderItems oi
WHERE oi.order = i.order AND oi.item_id IN (1, 2, 3) GROUP BY oi.order_id
) >= 3