2012-04-24 29 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