MySQL:根据付款计算剩余订阅天数

MySQL:根据付款计算剩余订阅天数,mysql,sql,date,subscription,Mysql,Sql,Date,Subscription,我正在开发一个应用程序,其中我们有三个不同的订阅计划(我们称之为小型、标准、高级),每个计划有三个不同的长度(30天、60天和90天)。每个用户可以订阅多个服务 我有以下表格(简化): 我想使用支付历史记录来查找每个服务订阅的剩余天数,但当我意识到用户有可能在当前服务计划或服务到期之前购买两个相同的服务计划或服务时,我遇到了一个问题 假设用户在以下日期购买了属于同一服务的两个服务计划: 付款 id | user_id | service_id | service_plan_id | amount

我正在开发一个应用程序,其中我们有三个不同的订阅计划(我们称之为小型、标准、高级),每个计划有三个不同的长度(30天、60天和90天)。每个用户可以订阅多个服务

我有以下表格(简化):

我想使用支付历史记录来查找每个服务订阅的剩余天数,但当我意识到用户有可能在当前服务计划或服务到期之前购买两个相同的服务计划或服务时,我遇到了一个问题

假设用户在以下日期购买了属于同一服务的两个服务计划:

付款

id | user_id | service_id | service_plan_id | amount | created_at
1  | 1       | 1          | 1               | 40.00  | 2014-06-10 12:23:56
2  | 1       | 1          | 2               | 65.00  | 2014-06-15 12:27:11
id | service_id | days | price
1  | 1          | 30   | 40.00
2  | 1          | 60   | 65.00
服务计划如下所示(简化):

服务计划

id | user_id | service_id | service_plan_id | amount | created_at
1  | 1       | 1          | 1               | 40.00  | 2014-06-10 12:23:56
2  | 1       | 1          | 2               | 65.00  | 2014-06-15 12:27:11
id | service_id | days | price
1  | 1          | 30   | 40.00
2  | 1          | 60   | 65.00
现在让我们假设今天的日期是: 2014-07-09

那么今天,用户将有1天剩余的第一次付款。由于另一笔付款是针对同一项服务的(虽然是5天之后),它尚未生效,因此剩余的总天数应为61天

我一直在琢磨这个问题,没有找到任何类似的问题。有人能解释一下,并提出一个SQL解决方案吗?也许我在这里使用了错误的模型,存储了错误的东西


//卡尔·大卫(Carl David)

我认为您的表中存储的数据不够

现在,您将始终需要查看以前的每一笔付款,以确定当前付款是处于活动状态还是正在等待激活状态,这是一个巨大的性能损失和更复杂的查询


对于
付款
计算的
expires\u在
列中,该列是在将新付款添加为
MAX(payments.expires\u at)+INTERVAL service\u plan.days
时计算出来的,您只需查看一行即可计算出剩余天数。。以及用户是否在计划中。

目前,这个问题还不清楚。如果你喜欢,考虑下面简单的两步行动:1。如果您还没有这样做,请提供适当的DDL(和/或SQLFIDLE),以便我们可以更轻松地复制问题。2.如果您尚未这样做,请提供与步骤1中提供的信息相对应的所需结果集。此外,付款金额是否会低于(或高于)其相关服务计划价格?如果是这样的话,在这些情况下发生了什么?或者是支付。金额与这个问题无关(在这种情况下考虑从问题中删除)是否有(例如)在同一天支付的10个款项?例如,在您的示例中,用户id 1是否会在2014/06/15重复付款?如果是这样的话,我正在努力想一种不用反复询问就能做到这一点的方法。如果是这样的话,那么对其进行一点反规范化,这样您就可以存储一个类似于@FuzzyTree suggestion的累积结束日期,这可能是最好的。@草莓:我不能提供任何SQL,因为这正是我所要求的。金额是相关的,因为价格可能会变化。@Kickstart:是的,理论上。