首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据事务数据计算当前成员余额

根据事务数据计算当前成员余额
EN

Stack Overflow用户
提问于 2010-11-20 13:53:37
回答 7查看 1.3K关注 0票数 3

我有一个金融交易的MySQL表。

表如下所示:

代码语言:javascript
运行
复制
+----+-----------+--------+--------+---------+---------+
| id | member_id | status | amount | opening | closing |
+----+-----------+--------+--------+---------+---------+
| 1  | 2         | 1      | 1000   | 0       | 1000    |
| 2  | 2         | 2      | 100    | 1000    | 1000    |
| 3  | 2         | 1      | -20    | 1000    | 980     |
| 4  | 2         | 1      | 10     | 980     | 990     |
+----+-----------+--------+--------+---------+---------+

当前期初和期末字段为空。状态%1为已提交,状态%2为未提交。

有人能告诉我如何编写一个查询来扫描整个表并更新所有期初和期末余额吗?

这个表中几乎有1,000,000条记录,所以如果查询得到了很好的优化就更好了。此外,对于实时任务关键数据,这也不是必需的。这只是成员余额的当前估计值。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-11-30 14:26:14

ajreal的解决方案中有一个疏忽-它不会为不同的成员ids重置平衡变量。这个版本解决了这个问题。

这是有效的(我测试了它):

代码语言:javascript
运行
复制
set @clo:=0, @opn:=0, @mem:=0; 
update member_txns 
set
  opening=if(status=1, @opn:=if(@mem=(@mem:=member_id), @clo, 0), @clo), 
  closing=if(status=1, @clo:=@opn+amount, @clo) 
order by member_id, id;
票数 3
EN

Stack Overflow用户

发布于 2010-11-20 14:11:54

你真的不想以这种方式实现它。你不知道当你需要回溯一笔交易时,你会发现自己身处一个痛苦的世界。1m条记录不是很多,所以索引应该足够了……

票数 2
EN

Stack Overflow用户

发布于 2010-11-25 20:15:34

  1. 存储余额在此处是非规范化的,不需要
  2. 如果您确实要存储余额,则应将其放在Members表

一个简单的SELECT member_id, SUM(amount) as Balance GROUP BY member_id就能给出结果。如果你真的有性能问题,你总是可以根据你的情况转置一个nice trick by Allen Browne

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4231437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档