如何编写日期值在一个范围内和另一个范围外的连接查询

0mkxixxg  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(272)

问题基本上是这样的:我有一个表“client”和一个表“service”,其中一个客户端可能请求了多个服务。现在,我需要一个查询,它返回在一个三个月内请求过服务的客户机列表,但在另一个三个月内没有。
示例:仅在2018-04-01至2018-06-30期间请求服务,但在2018-01-01至2018-03-31期间未请求服务的客户。
如何将该请求转换为查询?
我试过在一个简单的查询中使用“not between”,但它不起作用(不管“between”的措辞如何)。它只是在怀孕中期返回客户,而忽略了怀孕初期的“not”子句。我也试过两次加入服务表,结果是一样的。
我是如何尝试的:

SELECT DISTINCT c.id_client
FROM client c
JOIN service s1 on c.id_client = s1.id_client
JOIN service s2 on c.id_client = s2.id_client
WHERE s1.date between '2018-04-01' and '2018-06-30'
AND !(s2.date between '2018-01-01' and '2018-03-31')

这显然是错误的,我试着用几种不同的方式写第二个“中间”子句。最有趣的是,相反的方法工作得很好,在两个范围之间选择请求服务的客户机。我考虑过在上面运行一个“not in”子查询,但它很可能会在以后再来咬我。
什么是合适的方法?

qncylg1j

qncylg1j1#

这是未经测试,但我认为它应该给你的结果,你的追求。
理论是从所有客户开始( FROM client c ),并将结果集筛选给在今年第二季度明确请求服务的客户( INNER JOIN service s1 ).
然后,尝试查找今年第一季度请求的服务( LEFT JOIN service s2 ). 这个 LEFT JOIN 这一点很重要,因为并非所有客户都会在第一季度请求服务。那些被排除在外的 WHERE s2.id_service IS NULL .

SELECT c.id_client
FROM client c
INNER JOIN service s1 
    ON c.id_client = s1.id_client
    AND s1.date BETWEEN '2018-04-01' AND '2018-06-30'
LEFT JOIN service s2
    ON c.id_client = s2.id_client
    AND s2.date BETWEEN '2018-01-01' AND '2018-03-31'
WHERE s2.id_service IS NULL;

相关问题