2012-09-21 206 views
0

我想知道是否有可能在mysql中執行特定查詢,而不必求助於基於應用程序的過濾和多個查詢。MySql按日期篩選複雜查詢

基本上,我有一個客戶表,我有一個證書表的每個人(包括那些不是我的客戶)

每個客戶可以有多個證書,以及我對每個證書的有效期限。

我希望能夠選擇那些證書即將過期的客戶(在2周或更短的時間內),並且沒有其他證書的更長的到期日期。

第一部分是容易的,我執行內部聯接基於兩個表之間的SSN,與where子句從現在到現在+2周像這樣specifing日期終止日期:

select certs.ssn, certs.cert_num, certs.cert_start, certs.cert_finish 
    from certs 
    INNER JOIN customers ON certs.ssn = customers.ssn 
    where certs.cert_finish < Date_ADD(now(), INTERVAL 14 DAY) 
    and certs.cert_finish > now() 

然而,我無法找到一種方法來排除那些擁有其他有效期更長的證書的客戶。

你們有什麼想法嗎?我正在考慮一個基於max(cert_finish)的子查詢,僅在前一個查詢返回的那些ssns上。

回答

1

您可以用GROUP BY和HAVING子句做到這一點:

select customers.ssn, certs.cert_num, certs.cert_start, certs.cert_finish 
from customers INNER JOIN 
    certs 
    ON certs.ssn = customers.ssn 
group by customers.ssn 
having sum(case when certs.cert_finish < Date_ADD(now(), INTERVAL 14 DAY) and 
        certs.cert_finish > now() 
       then 1 else 0 
      end) > 0 and -- has soon to expire certicate 
     sum(case when certs.cert_finish > Date_ADD(now(), INTERVAL 14 DAY) 
       then 1 else 0 
      end) = 0  -- has no certificate that will expire later 

如果你想要更多的客戶信息,以此作爲一個子查詢並加入返還給客戶表。

+0

非常感謝,謝謝! – user1543495