我有一个带有架构的mysql表,如下所示:
group id amount fraction
1 1 3
1 2 5
2 3 2
2 3 1
每一行都属于一个组。每行还存储一个名为amount
的特定值。我想找到每行所有组amount
的分数,因此表格如下所示:
AFTER
group id amount fraction
1 1 3 .375
1 2 5 .625
2 3 2 66.67
2 3 1 33.33
要获取第1列的值,我总结第1组中的所有amount
列。这将是3 + 5,即8。然后我将第1行中的amount
除以小组总和,产生.375。我为他们所有人做了这件事。
我可以通过写这样的查询来做到这一点:
SELECT SUM(amount) GROUP BY group
然后遍历每个组,选择该组中的行,计算分数,并更新行。不幸的是,这意味着在初始查询之后,我将处理2个嵌套for循环,以及数百万个查询,这将花费很长时间给定数据集的大小。
我有一种微妙的感觉,有一种方法可以通过一个mysql查询更有效地做到这一点。如果任何人对如何使用单个查询执行此操作有任何想法,那就是我的问题。
答案 0 :(得分:2)
您可以使用join
和聚合:
select t.*, t.amount / tt.sumamount
from t join
(select group, sum(amount) as sumamount
from t
group by group
) tt
on t.group = tt.group;
编辑:
update
非常相似:
update t join
(select group, sum(amount) as sumamount
from t
group by group
) tt
on t.group = tt.group
set fraction = t.amount / tt.sumamount;