我正在尝试查看是否可以在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。
答案 0 :(得分: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
如果您需要其他客户信息,请将其用作子查询并加入客户表。