2011-02-10 3 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 или -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-запросы.

+2

Вы хотите общее количество? Почему бы вам просто не SUM (event_type) и использовать LIMIT для того, сколько строк вы хотите –

+2

Зачем вам это нужно? Кажется, он не соответствует реляционной модели. – cherouvim

+0

Я хочу нарисовать эти значения. Вы предлагаете лучший способ сделать это? – Khaled

ответ

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 указал в комментариях, это редкость, чтобы сохранить этот расчет в БД, особенно если БД является база данных OLTP.

Смежные вопросы