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

问题描述 投票:0回答:1

我有一个表,其中包含用户对特定服务的订阅,按月计费。 还有一个“暂停”表 - 带有“开始”和“结束”日期,用于存储有关用户暂时暂停其订阅的信息。

有三种可能的情况:

  • “开始”和“结束”日期都是过去的日期 - 用户的订阅在过去一段时间内被暂停,但现在订阅又重新激活了
  • “from”是过去的,但“to”是未来的或为 NULL - 服务此时暂停(直到“to”日期或无限期)
  • 'from' 和 'to' 是将来的(或者 'from' 是将来的,'to' 是 NULL) - 用户请求未来订阅暂停/取消,但目前服务仍然有效

对于给定的订阅,“暂停”中可能有多个条目,有些可能已经完成(过去),有些“正在进行”。

现在我需要选择有效订阅。

我尝试做一些类似的事情:

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 个非活动结果的结果?

mysql join select group-concat group
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.