【问题标题】:MySQL: Calculating remaining days of subscriptions based on paymentsMySQL:根据付款计算剩余订阅天数
【发布时间】:2014-07-10 09:07:15
【问题描述】:

我正在开发一个应用程序,其中我们有三种不同的订阅计划(我们称它们为小型、标准、高级),每一种都具有三种不同的长度(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 解决方案吗?也许我在这里使用了错误的模型,存储了错误的东西?

// 卡尔-大卫

【问题讨论】:

  • 目前这个问题还不清楚。如果您愿意,请考虑遵循这个简单的两步操作: 1. 如果您还没有这样做,请提供适当的 DDL(和/或 sqlfiddle),以便我们可以更轻松地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。
  • 另外,付款金额是否可以低于(或高于)其相关服务计划的价格?如果是这样,在这些情况下会发生什么 - 或者 payment.amount 与此问题无关(在这种情况下,请考虑将其从问题中删除)
  • 是否可以(例如)在同一天进行 10 次付款?即,在您的示例中,user_id 1 是否可以在 2014 年 6 月 15 日重复付款?如果是这样,我正在努力想出一种无需重复查询的方法。如果是这样,那么对其进行非规范化处理,以便您可以存储类似于@FuzzyTree 建议的累积结束日期可能是最好的。
  • @Strawberry:我无法提供任何 SQL,因为这是我所要求的。金额是相关的,因为价格可能会发生变化。
  • @Kickstart:理论上是的。

标签: mysql sql date subscription


【解决方案1】:

我建议您在表中没有完全存储足够的数据。

就像现在一样,您总是需要查看以前的每笔付款,以确定当前付款是处于活动状态还是等待激活、性能受到很大影响和更复杂的查询。

为payments 计算出的expires_at 列是在添加新付款时计算出来的,因为MAX(payments.expires_at) + INTERVAL service_plans.days DAYS 将允许您通过仅查看一行来计算剩余天数.. 和用户是否在计划中。

【讨论】:

    猜你喜欢
    • 2012-05-26
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2010-11-13
    • 1970-01-01
    • 2021-06-11
    相关资源
    最近更新 更多