ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql – 计算与事务一起存储的运行余额

2019-08-06 23:18:03  阅读:246  来源: 互联网

标签:performance mysql database-design aggregate


我需要从遗留系统中提供余额和交易数据的只读副本,该副本仅用于查看/打印语句.

Balance
| id | member_id | product_id | balance |
|  1 |    100001 |         33 |  975.00 |
|  1 |    100002 |         15 |   10.43 |
|  1 |    100001 |         15 |    0.00 |

Transactions
| id | member_id | product_id |       date |    value | interest |
|  1 |    100001 |         33 | 2014-09-01 |  -100.00 |     0.00 |
|  2 |    100001 |         33 | 2014-08-20 |   600.00 |     0.00 |
|  1 |    100002 |         15 | 2014-06-01 |   -50.00 |     0.00 |
|  2 |    100001 |         15 | 2014-08-20 |  -600.00 |     0.00 |

此数据是只读的,并且由于遗留系统的外部问题,来自表的数据将被清空,并且每次更新数据时都会重新插入所有内容.不理想,遗留系统应在18个月内更换.

我导入的交易数据没有运行余额列.我需要这个,并提出了两个选择:

>不要为每笔交易存储计算余额,而是即时计算.这使得对帐户报表的分页变得很痛苦,因为无论过去我们必须从最新的余额开始并回溯所有交易历史.我知道没有快速的方法来做这个递归查询.
>导入事务时计算运行余额,并将其存储在每一行中.

第二个是我的首选选项(在提取“2009年3月的声明”时很容易).我试图设计一种更新运行平衡的有效方法:我最好的是代码选择特定用户帐户的所有交易,然后循环更新数字.这不符合要求.

你会怎么处理这个?我必须研究MySQL,但我也有兴趣看到比它支持的更优雅的解决方案.

解决方法:

根据评论尝试答案

最简单,最快捷的方法是采用基于集合的方法.像这样:

1)将NOW()读入变量@N

2)将新数据加载到事务中

3)像这样更新平衡:

UPDATE Balance B
INNER JOIN (
  SELECT SUM(value) as value, member_id, product_id 
  FROM Transactions 
  WHERE date >= @N) AS T
ON B.member_id = T.member_id
AND B.product_id = T.product_id
SET B.balance = B.balance + T.value

4)利润

标签:performance,mysql,database-design,aggregate
来源: https://codeday.me/bug/20190806/1604231.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有