sql选择不包含某些项目的订单

时间:2015-01-05 01:48:20

标签: mysql sql

数据库有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将获得几乎所有订单(数百万结果)。

4 个答案:

答案 0 :(得分:3)

尝试使用group byhaving

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