我正在开发一个应用程序,其中我们有三种不同的订阅计划(我们称它们为小型、标准、高级),每种订阅计划具有三种不同的期限(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
服务计划如下所示(简化):
服务计划
id | service_id | days | price
1 | 1 | 30 | 40.00
2 | 1 | 60 | 65.00
现在假设今天的日期是: 2014-07-09
然后今天,用户从第一笔付款开始还剩 1 天。而由于另一笔付款是针对相同的服务(虽然晚了 5 天),但它根本还没有生效,所以剩余的总天数应该是 61 天。
我一直在摸索这个问题,但没能找到任何类似的问题。任何人都可以阐明并提出 SQL 解决方案吗?也许我在这里使用了错误的模型,存储了错误的东西?
//卡尔大卫
最佳答案
我建议您没有在表中存储足够的数据。
就像现在一样,您将始终需要查看之前的每笔付款以确定当前付款是处于事件状态还是等待激活,这是一个巨大的性能损失和更复杂的查询。
payments
的计算 expires_at
列,在添加新付款时计算为 MAX(payments.expires_at) + INTERVAL service_plans.days DAYS
将允许您通过仅查看一行来计算剩余天数......以及用户是否在计划中。
关于MySQL:根据付款计算订阅的剩余天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24672511/