问题基本上是这样的:我有一个表“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”子查询,但它很可能会在以后再来咬我。
什么是合适的方法?
1条答案
按热度按时间qncylg1j1#
这是未经测试,但我认为它应该给你的结果,你的追求。
理论是从所有客户开始(
FROM client c
),并将结果集筛选给在今年第二季度明确请求服务的客户(INNER JOIN service s1
).然后,尝试查找今年第一季度请求的服务(
LEFT JOIN service s2
). 这个LEFT JOIN
这一点很重要,因为并非所有客户都会在第一季度请求服务。那些被排除在外的WHERE s2.id_service IS NULL
.