2016-08-19 61 views
2

我现在正在用货币到期追踪问题(原来它不是金钱,但我用它作为一个更方便的例子)。货币到期跟踪

用户可以通过某个神秘的原因从平台上赚钱,并花费他们购买东西(产品,礼品等)。

我正在查找算法(SQL查询最好的情况)来查找用户余额的当前余额。

支出和赚钱的事件存储不同的数据库(MySQL的)表(假设user_earneduser_spent)。因此,在正常情况下,我只需计算用户总数user_earned并减去所花费的金额(总计user_spent)。

但是!有一个条件,即赢得的用户资金在2年内到期如果他们不使用。 这意味着,如果用户没有使用他的资金或仅使用其中的一部分,他们将会过期。如果用户使用他的钱,他们从使用最早的未过期的货币记录,所以余额(奖金)可以计算在用户的青睐。

这是5分的情况在时间的事件,有对此案进行更好的理解:

Money expiration logic

两个表(user_earneduser_spent)已时间戳日期跟踪。

+0

这可能是一个最好在应用程序代码中完成的任务。 –

+0

目前,我已经实施了一项服务,通过简单地建立事件列表(接收,使用,到期)并逐个运行它们来计算余额。它的工作原理,但如果我需要在SQL查询中取得平衡以获得积极的平衡,我必须在数据库之前将该值非规格化。 – Aistis

回答

1

我在我的一个项目中做了类似的事情。

看起来像你需要一个额外的表spends_covering与列 spend_idearhed_idsum

所以每个spends记录你需要插入一个或多个行到spends_covering,以纪念“拿来主义”的钱。

然后余额将只是日期少于2年时未使用的总和。

select sum(sub.earned_sum-sub.spent_sum) as balance 
from 
    (select e.sum as earned_sum, sum(sc.sum) as spent_sum 
    from earned e 
     left join spends_covering sc on e.earhed_id=sc.earhed_id 
    where e.date BETWEEN ... 
    group by e.earhed_id 
    having earned_sum > spent_sum) sub 
0

它可能是值得的有两个表 - 一个(或多个)与所有的历史细节,只有当前余额为每个'用户'。一定要使用交易来保持两者同步。