2012-04-24 24 views
0

我需要知道,我如何做到這一點的飛行條件,MySQL的加入與參與上飛

例如我有誰在每個不同交貨期狀態的客戶,我要選擇MAX(最近到期日)ON LEFT JOIN目前當其加入它選擇的最古老的交貨期是不是我想要的兩個表..

SELECT c.customerid, i.datedue 
         FROM customers c 
           LEFT JOIN invoice i 
           ON i.customerid = c.customerid 
         WHERE i.datedue <= UNIX_TIMESTAMP() 
           AND c.status!='d' 
         GROUP BY i.customerid 
         ORDER BY i.datedue DESC 
         LIMIT 0, 1000 
+0

看起來好像您正在試圖建立一個客戶列表(通過ID),以及他們最近錯過的發票(如果有的話,再次通過ID) - 僅限於前1000個發票?那是對的嗎? – 2012-04-24 04:42:15

+0

由於32位unix時間戳只有68年的時間跨度,並且您可以在時間戳使用本機SQL時更快地執行其他日期函數,所以您還應該將截止日期保存爲日期時間或日期類型。例如,您可以將上述內容更改爲'WHERE i.datedue <= NOW()' – Anthony 2012-04-24 04:59:31

回答

2

您需要使用MAX()函數:

SELECT c.customerid, MAX(i.datedue) 
FROM customers c LEFT JOIN invoice i ON i.customerid = c.customerid 
WHERE i.datedue <= UNIX_TIMESTAMP() and c.status!='d' 
GROUP BY i.customerid 
ORDER BY i.datedue DESC 
LIMIT 0,1000 

這會給你t他最大限度地爲每個客戶取消。

+0

+1,以便保持簡單並使用經常被遺忘的「GROUP BY」 – Anthony 2012-04-24 04:43:10