2011-02-10 14 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に設定されます。 totalevent_typeという値を累積する簡単なSQLクエリはありますか?

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はコメントで指摘したように、それはDBはOLTPデータベースで特別な場合には、DBにこの計算を保存することは珍しいです。