2016-12-09 4 views
0

С учетом таблицы SQL, связанной с заказами и продуктами.SQL Выбор точных совпадений от многих до многих Таблица

CREATE TABLE Order_Product(
    unid INT NOT NULL AUTO_INCREMENT, 
    order_id INT NOT NULL, 
    product_id INT NOT NULL, 
    PRIMARY KEY (product_id) 
)ENGINE=InnoDb AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

Как решить, присутствует ли в базе данных Поручение с определенным списком продукции (только указанные продукты, не более или менее)? Мой текущий SQL-запрос объединяет две таблицы, первую таблицу для проверки того, какие Заказы содержат продукты (например, 34,48), а второй - поиск того, не содержит ли Заказ больше продуктов.

SELECT * 
FROM ( SELECT COUNT(op.order_id) hits, op.order_id 
    FROM Order_Product op 
    WHERE op.product_id IN (34,48) 
    GROUP BY op.order_id 
    HAVING COUNT(op.order_id) = 2 

) AS tabone 
JOIN (SELECT COUNT(op.order_id) total, op.order_id 
    FROM Order_Product op 
    GROUP BY op.order_id 
     ) AS tabtwo 
ON tabtwo.order_id = tabone.order_id 
WHERE hits = total 

Можете ли вы представить себе более простой способ достичь этого?

ответ

0

Попробуйте это (я предполагаю, что вы ищете заказы, содержащие по меньшей мере один продукт из списка и не все продукты в списке):

select * 
from Order_Product as op1 
where exists (
    select 1 
    from Order_Product as op2 
    where op2.order_id = op1.order_id 
    and op2.product_id in (34, 38) 
    ) 
and not exists (
    select 1 
    from Order_Product as op3 
    where op3.order_id = op1.order_id 
    and op3.product_id not in (34, 38) 
    ) 
0

Ваши вопросы звучит, как вы хотите, чтобы все заказы, должен содержать оба продукта 34 и 48, но не более и не менее.

SELECT op1.Order_ID 
FROM Order_Product op1 
JOIN (SELECT Order_ID, COUNT(DISTINCT Product_ID) AS Total_Products FROM Order_Product GROUP BY Order_ID) op2 
    ON op1.Order_ID = op2.Order_ID 
WHERE op1.product_id IN (34, 48) 
AND op2.Total_Products = 2 
GROUP BY op1.Order_ID