【发布时间】:2016-06-16 14:28:20
【问题描述】:
我们有一个以下 MySQL 表来维护用户信用。
id user credits expiry status
-----------------------------------------
1 A 1.2 somedatetime 0
2 A 4.4 somedatetime 0
3 A 5.0 somedatetime 0
4 B 1.0 somedatetime 0
5 B 2.4 somedatetime 0
6 C 7.8 somedatetime 0
每当用户进行购买时,我们都会从可用积分中扣除金额。为了对用户公平起见,最近到期的积分将首先被消耗,依此类推。我们还将更新状态以将行标记为已使用。
例如,如果用户 A 购买了 2 美元,则 1.2 美元将从 id 1 中扣除,剩余 0.8 美元将从 id 2 中扣除,依此类推。所以 Table 现在看起来像
id user credits expiry status
-----------------------------------------
1 A 0.0 somedatetime 1
2 A 3.6 somedatetime 1
3 A 5.0 somedatetime 0
4 B 1.0 somedatetime 0
5 B 2.4 somedatetime 0
6 C 7.8 somedatetime 0
到目前为止,我们一直在使用蛮力方法。任何想法建议如何在最少或单个查询中更有效地做到这一点。
更新:因为有人问起我们目前的蛮力方法,它从最旧的开始迭代每一行并更新直到覆盖购买金额,这是非常低效的。
谢谢
【问题讨论】:
-
已提出类似问题。
-
@Strawberry:请发布链接
-
“蛮力方法”是什么意思?
-
@shadow 逐行读取并更新直到覆盖购买金额。
-
2 美元中,1.2 美元将从 id 1 中扣除,剩余 0.6 美元 我的数学不太好,但我还有 0.8跨度>