Mysql 如何根据其ID-s对金额求和,并将结果添加到现有表的新列中
我有一个快速增长的数据库表(下表),它有超过400万行 这是我正在讨论的表格:Mysql 如何根据其ID-s对金额求和,并将结果添加到现有表的新列中,mysql,sql,Mysql,Sql,我有一个快速增长的数据库表(下表),它有超过400万行 这是我正在讨论的表格: # Name Type Collation Attributes Null Default Extra Action 1 user_id int(11) No None Change Change Drop Drop Browse distinct values Browse distinct values Primary Pr
# Name Type Collation Attributes Null Default Extra Action
1 user_id int(11) No None Change Change Drop Drop Browse distinct values Browse distinct values Primary Primary Unique Unique Show more actions More
2 amount decimal(16,8) No None Change Change Drop Drop Browse distinct values Browse distinct values Primary Primary Unique Unique Show more actions More
3 aff int(11) No 0 Change Change Drop Drop Browse distinct values Browse distinct values Primary Primary Unique Unique Show more actions More
4 jackpot int(11) No 0 Change Change Drop Drop Browse distinct values Browse distinct values Primary Primary Unique Unique Show more actions More
5 paidout int(11) No 0 Change Change Drop Drop Browse distinct values Browse distinct values Primary Primary Unique Unique Show more actions More
6 type int(11) No 0 Change Change Drop Drop Browse distinct values Browse distinct values Primary Primary Unique Unique Show more actions More
7 created timestamp No CURRENT_TIMESTAMP Change Change Drop Drop Browse distinct values Browse distinct values Primary Primary Unique Unique Show more actions More
我运行一个查询,按用户id对金额求和,然后得到结果
SELECT user_id, SUM(amount)
FROM trans
group by user_id;
我的问题是如何将这些结果(SUM-s)添加到另一个现有表中我有相同的用户ID并将这些SUM-s保存在那里
我现有的表具有这种结构
# Name Type Collation Attributes Null Default Extra Action
1 id int(4) No None AUTO_INCREMENT Change Change Drop Drop Browse distinct values Browse distinct values Primary Primary Unique Unique Show more actions More
2 balance int(11) No None Change Change Drop Drop Browse distinct values Browse distinct values Primary Primary Unique Unique Show more actions More
3 ads varchar(60) latin1_swedish_ci No None Change Change Drop Drop Browse distinct values Browse distinct values Primary Primary Unique Unique Show more actions More
4 ip varchar(85) latin1_swedish_ci No Change Change Drop Drop Browse distinct values Browse distinct values Primary Primary Unique Unique Show more actions More
5 hash varchar(150) latin1_swedish_ci No None Change Change Drop Drop Browse distinct values Browse distinct values Primary Primary Unique Unique Show more actions More
6 email varchar(150) latin1_swedish_ci No None Change Change Drop Drop Browse distinct values Browse distinct values Primary Primary Unique Unique Show more actions More
7 aff int(11) No 0 Change Change Drop Drop Browse distinct values Browse distinct values Primary Primary Unique Unique Show more actions More
8 with int(11) No 0 Change Change Drop Drop Browse distinct values Browse distinct values Primary Primary Unique Unique Show more actions More
9 timestamp bigint(20) UNSIGNED No 0 Change Change Drop Drop Browse distinct values Browse distinct values Primary Primary Unique Unique Show more actions More
我希望将总和放在id列之后的新列上。您可以执行以下操作:
alter table table2 add column thesum decimal(16, 8);
update table2 t2
set thesum = (select sum(amount) from table1 t1 where t2.user_id = t1.user_id)
现在,这有一些问题。当第一个表中的值更改时,第二个表中的值不会更改。要实现这一点,需要使用触发器重新调整值
通常,建议对此类流程使用视图。然而,这并不是特别有效。我的猜测是,出于性能原因,您需要总结这些值。如果是这样,请注意保持值的一致性
编辑:
要将总数相加,只需执行以下操作:
update table2 t2
set thesum = thesum + coalesce((select sum(amount) from table1 t1 where t2.user_id = t1.user_id), 0);
我之所以需要这样做,是因为我需要定期删除这个大表,因为它会使我的服务器速度减慢太多,并在另一个服务器上保留更新的余额table@user38935 . . . 在较大的表上,可能还有其他方法来提高性能,例如使用分区。然而,这是对另一个问题的回答。如果您想保留所有历史记录并获得良好的性能,请问另一个问题。第一次查询运行良好,但现在如果我清空表nr1,并且在一段时间后生成了新行,我需要将新的Sum添加到表nr2和nr2的Sum on列中(SUM-s,新的SUM生成的orm表Nr1和表nr2上的旧SUM)现在我用大表测试它,查询似乎阻塞了服务器,我多次测试重启服务器,但每次服务器阻塞,php管理员没有响应,我都会问一个关于改进此表的权限的新问题