我有一个表,其中包含用户对特定服务的订阅,按月计费。 还有一个“暂停”表 - 带有“开始”和“结束”日期,用于存储有关用户暂时暂停其订阅的信息。
有三种可能的情况:
对于给定的订阅,“暂停”中可能有多个条目,有些可能已经完成(过去),有些“正在进行”。
现在我需要选择有效订阅。
我尝试做一些类似的事情:
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 子句将处理第一个暂停条目作为“活动服务”(过去暂停),第二个作为“目前不活动”(并按预期省略该服务),结果我将该服务设为活动(因为第一个条目),而在事实上它是不活动的。
如何做到这一点?以某种方式计算(或连接)“活动”结果和“非活动”结果,按 customer_id 分组,然后仅过滤那些具有 0 个非活动结果的结果?
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