2011-09-16 67 views
4

我試圖選擇過去2個月中根本沒有銷售的所有項目。連接表中兩個日期之間不存在記錄

我嘗試使用此查詢,但預計它不工作:

SELECT SalesDescription FROM Items I 
LEFT JOIN Orders_Items OI 
ON OI.ItemID=I.ItemID 

LEFT JOIN Orders O 
ON O.OrderID=OI.OrderID 

WHERE OrderTime NOT BETWEEN date_sub(curdate(), interval 2 month) 
AND date_sub(curdate(), interval 1 day) 
Group By I.ItemID 

基本上,我希望能得到大家從項目表(按項目ID分組)的記錄,如果和只有在過去兩個月內沒有訂購。

當我做我的加入以上,所得到的表是這樣的:

Name  OrderID  OrderDate 
Widget A  1   Last Year  
Widget B  2   Last Week 
Widget C  3   Last Year 
Widget C  4   Last Week 

我的結果應該只返回窗口小部件,因爲它沒有在過去2個月訂購。一年前訂購的這一事實並不相關。

Widget C不應該出現,因爲包含Widget C的訂單在過去2個月內被放置。

問題是,我想要的記錄沒有與它們關聯的日期範圍。另一種說法是:

我想從Items表中的所有項目開始,然後排除附有訂單的項目,並且至少有一個附加訂單放在2個月範圍內。

我該怎麼做?

回答

3

就個人而言,我覺得這是你的問題的最清楚的表述:

SELECT SalesDescription FROM Items I 
    WHERE NOT EXISTS (SELECT * FROM Orders O 
         WHERE O.ItemID = I.ItemID AND O.OrderTime BETWEEN X AND Y) 

(其中X和Y是有問題的日期)。

你也可以寫這樣說:

SELECT SalesDescription FROM Items 
    WHERE ItemID NOT IN 
      (SELECT ItemID FROM Orders O WHERE O.OrderTime BETWEEN X AND Y) 

兩個版本應該是「不夠快」了幾千項偶爾使用。如果您的商品表格更大,或者您需要在某種在線交易(而不是報表)中執行此查詢,則可以使用其他方法來編寫它。你甚至可以通過JOIN來完成,但是你只需要連接一次訂單,而不是兩次。

(注意:您對請求中的問題有兩種不同的定義:首先,您要求在過去兩個月內沒有出售的所有商品,然後在摘要中詢問所有商品至少賣出一次,但最近兩個月沒有售出,第一個版本(我回答的)將包含從未出售過的物品,第二個版本不包括它們。)

+0

寫着完全一樣的東西。 – dispake

+0

+1第一個返回了一個空的結果集,但第二個做了我想要的。謝謝! – Nick

+0

這實際上令人苦惱,我期望他們都有同樣的結果。 –

相關問題