2011-02-10 119 views
1

我有一个包含很多行的MySQL表。表结构如下: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-1total将初始设置为NULL。是否有任何简单的SQL查询将在total中累积event_type的值。因此,该表将是这样的:

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查询就可以。

+2

你想要一个跑步总和?为什么你不只是SUM(event_type)并且使用LIMIT来定义你想要的行数 – 2011-02-10 07:47:43

回答

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; 
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,特别是如果该数据库是一个OLTP数据库。