簡體   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