2010-06-28 77 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