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

时间:2014-07-10 09:07:15

标签: mysql sql date subscription

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

我有以下表格(简化):

**services**
id, name

**user_services**
user_id, service_id

**service_plans**
id, service_id, days, price

**payments**
id, user_id, service_id, service_plan_id, amount, created_at

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

让我们说用户在以下日期购买了属于同一服务的两个服务计划:

付款

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

服务计划看起来像这样(简化):

service_plans

id | service_id | days | price
1  | 1          | 30   | 40.00
2  | 1          | 60   | 65.00

现在让我们说今天的日期是: 2014年7月9日

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

我一直在摸不着头脑,却找不到任何类似的问题。任何人都可以解释一下并提出SQL解决方案吗?也许我在这里使用错误的模型,存储错误的东西?

// Carl-David

1 个答案:

答案 0 :(得分:1)

我建议您在表格中存储的数据不够充足。

就像现在一样,您将始终需要查看以前的所有付款,以确定当前付款是处于活动状态还是等待激活,性能大幅提升以及查询更复杂。

expires_at的已计算payments列,已根据MAX(payments.expires_at) + INTERVAL service_plans.days DAYS添加新付款,可让您通过查看剩余天数来计算仅限一行..以及用户是否在计划中。