MySQL从连接表中选择特定条目

vbopmzt1  于 2023-11-16  发布在  Mysql
关注(0)|答案(1)|浏览(147)

我有一个用户订阅特定服务的表格,按月计费。还有一个“暂停”表格-从“和”到“日期存储有关用户临时暂停订阅的信息。
有三种可能的情况:

  • “从”和“到”日期都是过去的-用户在过去的一段时间内暂停了订阅,但现在订阅再次激活
  • “from”是过去的,但“to”是未来的或为NULL -此时服务暂停(直到“to”日期或不确定)
  • “from”和“to”是未来的(或“from”是未来的,“to”是空的)-用户请求未来的订阅暂停/取消,但目前服务仍然有效

对于给定的订阅,可能有多个条目处于“暂停”状态,有些可能已经完成(过去),有些“正在进行”。
现在我需要选择活动订阅。
我试着做一些事情,比如:

SELECT * FROM service 
LEFT JOIN suspensions ON service.id = suspensions.service_id 
WHERE 
  suspensions.id IS NULL 
OR 
  ( suspension_from < CURDATE() AND suspension_to < CURDATE() ) 
OR ( suspenstion_from > CURDATE() AND ( suspension_to > CURDATE() OR suspension_to IS NULL)) ) 
GROUP BY 
   service.customer_id

字符串
如果给定服务的“挂起”表中只有一个条目,则该方法有效。
但是,如果客户有多个暂停条目,其当前时刻的结果不同,例如从01-01-2021到31-12-2021和01-09-2023到31-08-2024,则WHERE子句将第一个视为“活动服务”(暂停在过去),第二个作为“目前不活动”(并省略了一个预期),并在结果中,我有该服务作为活动(因为第一个条目),而实际上它是不活动的。
如何做到这一点?以某种方式计数(或concat)“活动”结果和“非活动”结果,按customer_id分组,然后只过滤那些有0个非活动结果的结果?

zyfwsgd6

zyfwsgd61#

SELECT * 
FROM service 
LEFT JOIN suspensions ON service.id = suspensions.service_id 
WHERE suspensions.service_id IS NULL 
   OR CURRENT_DATE NOT BETWEEN suspension_from AND COALESCE(suspension_to, CURRENT_DATE) 
-- GROUP BY service.customer_id
-- maybe, ORDER BY service.customer_id ?

字符串

相关问题