我有一个包含很多行的MySQL表。表结构如下:
id: bigint,
event_type: int,
total: int
示例数据:
id event_type total
1 1 NULL
2 -1 NULL
3 1 NULL
4 1 NULL
5 1 NULL
6 -1 NULL
7 -1 NULL
8 -1 NULL
event_type可以是1
或-1
。 total
初始设置为NULL
。是否有任何简单的SQL查询将在event_type
中累积total
的值。因此,该表将如下所示:
id event_type total
1 1 1
2 -1 0
3 1 1
4 1 2
5 1 3
6 -1 2
7 -1 1
8 -1 0
此外,可以部分计算total
列。换句话说,我需要在表仍在修改时运行查询(通过插入)。我知道可以使用PHP或perl代码完成。但是,只使用SQL查询就可以了。
答案 0 :(得分:1)
UPDATE table t JOIN (
SELECT m.id, @RunTotal := @RunTotal + event_type RunTotal
FROM table m, (SELECT @RunTotal := 0) dk
ORDER BY m.id
) rs ON t.id = rs.id
SET t.Total = rs.RunTotal
正如cherouvim在评论中指出的那样,在db中保存此计算并不常见,特别是如果db是OLTP数据库。
答案 1 :(得分:1)
由于MySql确实不允许更新您正在读取的表,因此您可以使用临时表来执行此操作。
CREATE TABLE temp AS SELECT a.id, SUM(b.event_type) AS tot
FROM your_table a
LEFT JOIN your_table b ON b.id <= a.id
GROUP BY a.id;
UPDATE your_table,temp
SET your_table.total = temp.tot
WHERE your_table.id = temp.id;
DROP TABLE temp;