我在表格中添加了一个新列'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 | |-------|---------|---------|----------|---------|
答案 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
上进行排序。