数据库有3个表,“items”,“orders”和“orderitems”,代表N:N关系。我需要查找不包含某些项目的订单。例如,我想获得所有不包含苹果,橙子或香蕉的订单。
我试过了:
SELECT * FROM orders o,
LEFT JOIN orderitems oi ON o.order_id=oi.order_id
LEFT JOIN items i ON oi.item_id=i.item_id
WHERE
i.name NOT IN ('banana', 'apple', 'orange')
它不起作用。它返回所有订单,只要它们至少包含与'banana','apple'和'orange'不同的商品。
我想要做一个“NOT IN”包含所有包含这些项目的订单的子选择,但它会非常慢,因为subselect将获得几乎所有订单(数百万结果)。
答案 0 :(得分:3)
尝试使用group by
和having
:
SELECT oi.order_id
FROM orderitems oi JOIN
items i
ON oi.item_id=i.item_id
GROUP BY oi.order_id
HAVING SUM(i.name IN ('banana', 'apple', 'orange')) = 0;
如果您需要完整的订单信息,可以重新加入orders
表。
答案 1 :(得分:2)
<强>已更新强>
请尝试:
SELECT * FROM orders o
WHERE o.order_id
NOT IN
(
SELECT oi.order_id
FROM orderitems oi
INNER JOIN items i ON oi.item_id=i.item_id
WHERE
i.name IN ('banana', 'apple', 'orange')
)
答案 2 :(得分:0)
您也可以使用:
select *
from orders o
left join (select o.order_id
from orders o
join orderitems oi
on o.order_id = oi.order_id
join items i
on oi.item_id = i.item_id
where i.name in ('banana', 'apple', 'orange')) v
on o.order_id = v.order_id
left join orderitems oi
on o.order_id = oi.order_id
left join items i
on oi.item_id = i.item_id
where v.order_id is null
答案 3 :(得分:0)
听起来您希望获得所有包含您正在查看的商品的订单,然后从结果集中排除这些订单。
SELECT *
FROM orders o
LEFT JOIN (select order_id
from orderitems oi
inner join items i ON oi.item_id=i.item_id
WHERE i.name IN ('banana', 'apple', 'orange')
) x
ON o.order_id=x.order_id
WHERE x.order_id is null