2012-09-21 258 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