2015-10-12 44 views
0

我知道這可以寫成單個SQL語句,但我只是不知道該怎麼做。我有兩個單獨的查詢。安大略省,從去年在日期範圍內但不是最近的查詢幫助

SELECT * FROM `order` WHERE date_added BETWEEN '2014-10-01' AND '2014-11-01'; 

的特定時期內翻出所有的訂單和一個從上個月拉

SELECT * FROM `order` WHERE date_added BETWEEN DATE_SUB(now(), INTERVAL 1 MONTH) AND Now() ORDER BY date_added ASC 

我想要做的就是現在加入這兩個讓我只得到訂單的customer_id去年的日期範圍內(查詢1),但未在上個月(查詢2)中下單。

我知道有一種方法可以將它設置爲連接,但我對sql連接的知識並不是非常有限。謝謝你的幫助。

回答

1

http://sqlfiddle.com/#!9/35ed0/1

SELECT * FROM `order` 
WHERE date_added BETWEEN '2014-10-01' AND '2014-11-01' 
    AND customer_id NOT IN (
    SELECT DISTINCT customer_id FROM `order` 
    WHERE date_added BETWEEN DATE_SUB(now(), INTERVAL 1 MONTH) AND Now()) 

UPDATE如果每個customer_id只需要1條記錄,這裏是an example。從性能角度來看,這不是最好的。但是它僅返回每個客戶的最後(根據date_added列)訂單。

SELECT t.*, 
    if(@fltr=customer_id, 0, 1) fltr, 
    @fltr:=customer_id 
FROM (SELECT * 
    FROM `order` 
    WHERE date_added BETWEEN '2014-10-01' AND '2014-11-01' 
    AND customer_id NOT IN (
    SELECT DISTINCT customer_id FROM `order` 
    WHERE date_added BETWEEN DATE_SUB(now(), INTERVAL 1 MONTH) AND Now()) 
    ORDER BY customer_id, date_added DESC 
) t 
HAVING (fltr=1); 
+0

這很好,非常簡潔。如何比較不存在? – user3167249

+0

這對你的情況幾乎沒有區別。我喜歡「不在」,它對我來說似乎更加乾淨和合乎邏輯。 – Alex

+0

我注意到,如果有多個匹配項,這實際上會產生相同客戶ID的重複項。 DISTINCT是否無法將其縮小到唯一的customer_id? – user3167249

0

我喜歡用group byhaving來解決這些問題。您正在尋找客戶ID,所以:

select o.customer_id 
from orders o 
group by o.customer_id 
having sum(date_added BETWEEN '2014-10-01' AND '2014-11-01') > 0 and 
     sum(date_added BETWEEN DATE_SUB(now(), INTERVAL 1 MONTH) AND Now()) = 0; 
+0

這產生了超出我的時間段的結果。 – user3167249

+0

@ user3167249。 。 。我不明白你的評論。這隻能返回在2014年至少有一次購買並且最近一個月沒有購買的客戶。 –

1

我通常使用一個相關not exists斷言這個,因爲我覺得它有問題的意圖十分吻合:

SELECT * 
FROM `order` o1 
WHERE date_added BETWEEN '2014-10-01' AND '2014-11-01' 
    AND NOT EXISTS (
    SELECT 1 
    FROM `order` o2 
    WHERE date_added BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW() 
     AND o1.customer_id = o2.customer_id 
); 
+0

這很好。幾個問題。第二選擇中的1是什麼?我很困惑,也可以添加獨特的第一個選擇只獲得唯一的客戶ID? – user3167249

+0

@ user3167249'1'僅用於表示從子查詢返回的結果並不重要,因爲「存在」謂詞僅評估是否返回任何結果,而不是它返回的結果。你可以使用'*'或者一些列。我只是覺得這樣更清晰。至於「獨特」 - 是的,如果你只想要獨特的客戶,你可以做'選擇不同的o1.customer_id'。 – jpw