2010-06-28 74 views
0

我必须过滤没有特定产品的订单。如何用MySQL过滤正确的订单(一个订单包含多行)

这很简单,但问题是,每个订单可能有很多行,包含不同的产品。

这是我的数据的一个示例:

ID | Product | Customer  | Quantidy | Date 
1 | Apple | Alex Sorensen | 3  | 17.4.2009 
2 | Orange | Alex Sorensen | 1  | 17.4.2009 
3 | Lime | Alex Sorensen | 4  | 17.4.2009 
4 | Apple | Fred Jonsson | 1  | 30.5.2010 
5 | Lime | Fred Jonsson | 7  | 30.5.2010 
ect... 

线具有相同date和相同customer都为相同的顺序。

如何查找所有订单中没有(例如)Orange的订单?


我自己的(不工作)的MySQL代码:

SELECT o.ID, k.Customer, o.Quantidy, p.Product, o.Date 
FROM Products p, Orders o, Customers c 
WHERE p.ID = o.ID 
AND k.Customer = o.Customer 
AND p.Product NOT IN ('Orange') 
GROUP BY o.Date 
ORDER BY o.ID DESC 

的问题是,即使我不想“亚历克斯索伦森的”命令,因为它包含橘子,我得到他其他线路没有包含“橙色”的线路。

我需要一个SQL代码才能给我“Fred Jonsson”和其他订单,它们没有订单中的桔子。

+0

我有麻烦理解你的模型。你在'p.id = o.id'上加入'products'。这是否意味着你有'id = 1'的苹果,另一个'id = 4'? – 2010-06-28 09:33:04

+0

“p.ID = o.ID”是个错误,应该是“p.Product = o.Product”。我翻译并简化了其他语言的代码,这种方式非常糟糕。 – jsk 2010-06-28 10:04:43

+0

你的'p.Product = o.Product'是你选择的相同的'p.Product'吗(它实际上是否说'Orange'或者它是'Orange'的ID吗? – 2010-06-28 10:36:25

回答

1

您应该能够使用NOT EXISTS

SELECT o.ID, c.Customer, o.Quantity, p.Product, o.Date 
FROM Products p, Orders o, Customers c 
WHERE p.product = o.product 
AND c.Customer = o.Customer 
AND NOT EXISTS (SELECT 1 FROM Orders o2 
       WHERE o2.product = 'Orange' 
       AND o2.customer = o.customer 
       AND o2.date = o.date 
       ) 

尝试使用明确的方式连接语法,它会使阅读您的查询更容易,一旦你习惯了:

SELECT o.ID, c.Customer, o.Quantity, p.Product, o.Date 
FROM Orders o 
JOIN Products p ON (p.product = o.product) 
JOIN Customers c ON (c.Customer = o.Customer) 
WHERE NOT EXISTS (SELECT 1 FROM Orders o2 
        WHERE o2.product = 'Orange' 
        AND o2.customer = o.customer 
        AND o2.date = o.date 
       ) 

另一种方法是使用一个Left Join和检查NULL

SELECT o.ID, c.Customer, o.Quantity, p.Product, o.Date 
FROM Orders o 
JOIN Products p ON (p.product = o.product) 
JOIN Customers c ON (c.Customer = o.Customer) 
LEFT JOIN Orders o2 ON ( o2.product = 'Orange' 
         AND o2.customer = o.customer 
         AND o2.date = o.date 
         ) 
WHERE o2.Id IS NULL 

你必须尝试哪一种效果更好。

+0

我用了第一个! 首先我只得到一个结果,但是当我加入:“GROUP BY o。日期 ORDER BY o.ID DESC“到最后,我得到了一切。感谢!!!!! – jsk 2010-06-28 12:00:03

+0

感谢给我这么多的例子,它有助于未来! – jsk 2010-06-28 12:01:20

0

变化

p.Product NOT IN ('Orange') 

k.Customer NOT IN (select DISTINCT Customer from Products where Product= 'Orange') 


SELECT o.ID, k.Customer, o.Quantidy, p.Product, o.Date 
FROM Products p, Orders o, Customers c 
WHERE p.ID = o.ID 
AND k.Customer = o.Customer 
AND k.Customer NOT IN (select DISTINCT Customer from Products where Product= 'Orange') 
GROUP BY o.Date 
ORDER BY o.ID DESC 
+0

“产品”表似乎没有“客户”栏(我不希望它有一个)。你不会考虑对日期进行分组的命令。 – 2010-06-28 09:39:51

+0

是的,“产品”没有客户。 “ ”您不考虑日期,它也会对订单进行分组。“ - >对不起,我不明白,但我试图按日期分组,但它不起作用。 – jsk 2010-06-28 10:06:17

+0

请帮助,我如何让我的SQL工作? – jsk 2010-06-28 11:02:08