繁体   English   中英

从MySQL表中的行求和

[英]Sum up values from rows in MySQL table

我已在表中添加了新列“ sums”,并尝试根据表中所示的算法对“ vals”列中的值求和,然后更新同一表中的“ sums”。

我可以在PHP中编写一些循环,但我认为这不会很好。

任何线索如何很好地编写它?

--------------------------------------------------
|  id   |  sets   |  parts  |  vals    |  sums   |
|-------|---------|---------|----------|---------|
|   1   |    1    |    1    |    2     |    2    |
|-------|---------|---------|----------|---------|
|   2   |    1    |    2    |    3     |  2+3=5  |
|-------|---------|---------|----------|---------|
|   3   |    1    |    3    |    5     |2+3+5=10 |
|-------|---------|---------|----------|---------|
|   4   |    2    |    1    |    4     |    4    |
|-------|---------|---------|----------|---------|
|   5   |    2    |    2    |    1     |  4+1=5  |
|-------|---------|---------|----------|---------|
|   6   |    2    |    3    |    2     | 4+1+2=7 |
|-------|---------|---------|----------|---------|
|   7   |    3    |    1    |    6     |    6    |
|-------|---------|---------|----------|---------|

这应该返回您想要的总和值:

SELECT t.id
     , IF(t.sets=@prev_sets,@i:=@i+t.vals,@i:=t.vals) AS `sums`
     , @prev_sets := t.sets AS prev_sets
  FROM mytable t
  JOIN (SELECT @prev_sets := NULL, @i := 0 ) i
 ORDER BY t.sets, t.parts

您可以将其用作更新语句中的内联视图

UPDATE ( SELECT t.id
              , IF(t.sets=@prev_sets,@i:=@i+t.vals,@i:=t.vals) AS `sums`
              , @prev_sets := t.sets AS prev_sets
           FROM mytable t
           JOIN (SELECT @prev_sets := NULL, @i := 0 ) i
          ORDER BY t.sets, t.parts
       ) s
  JOIN mytable r
    ON r.id = s.id
   SET r.sums = s.sums

从示例数据来看,您似乎希望在sets上进行“分组”,并希望对每个组中的parts进行订购。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM