我正在开发一个应用程序,我们有三种不同的订阅计划(让我们称之为小型,标准版,高级版),每种版本都有三种不同的长度(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
答案 0 :(得分:1)
我建议您在表格中存储的数据不够充足。
就像现在一样,您将始终需要查看以前的所有付款,以确定当前付款是处于活动状态还是等待激活,性能大幅提升以及查询更复杂。
expires_at
的已计算payments
列,已根据MAX(payments.expires_at) + INTERVAL service_plans.days DAYS
添加新付款,可让您通过查看剩余天数来计算仅限一行..以及用户是否在计划中。