我目前正在处理货币到期跟踪问题(原本不是钱,但我把它作为一个更方便的例子)。
用户可以出于某种神秘的原因从平台赚钱,并用它们来购买东西(产品,礼品等)。
我正在寻找一种算法(SQL查询最佳案例)来查找用户余额的当前余额。
支出和赚钱的事件存储在不同的数据库( MySQL )表中(让我们说user_earned
和user_spent
)。因此,在正常情况下,我只需计算user_earned
的用户总数并减去花费的金额(总共user_spent
)。
BUT!如果不使用,赢得的用户资金将在2年后到期。 这意味着,如果用户没有使用他的钱或仅使用其中的一部分,他们将过期。如果用户使用他的钱,则使用最旧的未过期货币记录,因此可以根据用户的利益计算余额(奖金)。
这些是及时发生事件的5个场景,以便更好地了解案例:
两个表格(user_earned
和user_spent
)都有时间戳用于日期跟踪。
答案 0 :(得分:1)
我在我的一个项目中做了类似的事情。
您似乎需要一个包含列的附加表spends_covering
spend_id
,earhed_id
,sum
因此,对于每个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
答案 1 :(得分:0)
有两个表可能是值得的 - 一个(或多个)包含所有历史详细信息,一个仅包含每个“用户”的当前余额。请务必使用事务来保持两者同步。