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

标签 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

服务计划如下所示(简化):

服务计划

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/

相关文章:

php - INSERT INTO 不适用于 Mysql 数据库

mysql - 在 MySQL 中连接具有相同 ID 的行的字段

php - 无法在 CakePHP 应用程序中存储 01/01/1600 之前的日期

mysql - 为什么下面的查询没有给出正确的输出

php - 使用查询 (SQL) 从所有三个表获取数据

asp.net - 城市 zip 和州表的最佳数据库设计

mysql - 无法在简单代码上添加外键约束请帮忙

vba - 让VBA转换不同的日期格式

javascript - typescript - 从当前日期计算月份和年份

PHP从mysql打印在线用户名