mysql - 资金过期追踪

标签 mysql sql database database-design currency

我目前正在处理货币到期跟踪问题(最初它不是货币,但我将其用作更方便的示例)。

用户可以出于某种神秘的原因从平台上赚钱,并将其花在购买东西(产品、礼物等)上。

我正在寻找一种算法(SQL 查询最佳案例)来查找用户余额的当前余额。

花钱和赚钱的事件存储在不同的数据库 (MySQL) 表中(比如 user_earneduser_spent)。所以在正常情况下,我会简单地从 user_earned 中计算用户总数并减去花费的钱(user_spent 的总数)。

但是!有一个条件,如果不使用,赚取的用户资金将在 2 年内过期。 这意味着,如果用户没有使用他的钱或只使用了其中的一部分,它们就会过期。如果用户使用他的钱,他们会从最旧的未过期的钱记录中使用,因此可以计算有利于用户的余额(奖金)。

这些是 5 个具有时间事件的场景,以便更好地理解案例:

Money expiration logic

两个表(user_earneduser_spent)都有用于日期跟踪的时间戳

最佳答案

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

看起来您需要一个包含列的附加表 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

关于mysql - 资金过期追踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39033342/

相关文章:

MYSQL 外键,无法创建表(errno :150)

php - 如何阻止我的 sql 查询显示结果两次?

sql - 数据库版本升级后子查询性能变差

sql-server - SQL Server Management Studio 未显示表的正确数据空间

java - 使用 SQL 表中的 String[] 对象填充数组列表

mysql - 如何将当前日期范围从 Fullcalendar 传递到从 MySQL 检索数据的 JSON 函数

php - 带变量的复杂sql查询

mysql - App Engine 中的 GoLang 动态 SQL 查询

java - ClassLoader.getResource 不断为现有资源返回 null

java - H2 Console Servlet 不显示表格