【问题标题】:MySql Complex query filtering by datesMySql 复杂查询按日期过滤
【发布时间】:2012-09-22 03:19:47
【问题描述】:

我正在尝试查看是否可以在 mysql 中执行特定查询,而不必求助于基于应用程序的过滤和多个查询。

基本上,我有一个客户表,并且我为每个人(包括那些不是我的客户)都有一个证书表

每个客户可以有多个证书,我在每个证书上都有到期日期。

我希望能够选择那些证书即将过期(2 周或更短时间)并且没有另一个过期日期更长的证书的客户。

第一部分很简单,我在两个表之间执行基于 ssn 的内部连接,其中 where 子句指定从现在到现在 + 2 周的日期终止日期,如下所示:

 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。

【问题讨论】:

    标签: mysql sql


    【解决方案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
    

    如果您需要更多客户信息,请将其用作子查询并连接回客户表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-16
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      • 2015-05-11
      • 2019-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多