从MySQL表中的行总结值

时间:2013-08-30 05:31:50

标签: mysql

我在表格中添加了一个新列'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    |
|-------|---------|---------|----------|---------|


1 个答案:

答案 0 :(得分:0)

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

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上进行排序。