У меня есть настройки со следующими таблицами (с использованием MySQL):
orders
, которых много:
- соединительный стол
order_items
, который имеет один из:
products
таблица
Я написал запрос для выбора orders
, где все их products
имеют определенный type
:
SELECT orders.* FROM orders
INNER JOIN order_items ON order_items.order_id = orders.id
INNER JOIN products ON products.id = order_items.product_id
WHERE products.type = 'FooProduct'
AND (
NOT EXISTS (
SELECT null
FROM products
INNER JOIN order_items ON order_items.product_id = products.id
WHERE order_items.order_id = orders.id
AND products.type != 'FooProduct'
)
)
Я запускаю подобное пару раз: сначала для получения заказов, состоящих из всех FooProduct
с, и снова для получения заказов со всеми BarProduct
с.
Моим камнем преткновения было создание третьего запроса для получения всех других заказов, т. Е. Когда все типы их продуктов не являются исключительно FooProduct
с или исключительно BarProduct
с (то есть смесь двух или другого продукта). типов).
Итак, мой вопрос: как я могу получить все записи, где все типы продуктов не являются исключительно FooProduct
с или исключительно BarProduct
.
Вот небольшой пример данных, из которых я хотел бы вернуть заказы с идентификаторами 3 и 4:
- orders
id
1
2
3
4
-- order_items
id order_id product_id
1 1 1
2 1 1
3 2 2
4 2 2
5 3 3
6 3 4
7 4 1
8 4 2
-- products
id type
1 'FooProduct'
2 'BarProduct'
3 'OtherProduct'
4 'YetAnotherProduct'
Я пытался это сделать, ужасно, поэтому поместил в качестве подтекста следующее вместо существующего AND
(даже с синтаксисом нет):
NOT HAVING COUNT(order_items.*) = (
SELECT null
FROM products
INNER JOIN order_items ON order_items.product_id = products.id
WHERE order_items.order_id = orders.id
AND products.type IN ('FooProduct', 'BarProduct')
)