2012-02-03 11 views
3

これは私のデータベースに歌の平均評価を算出し、select文である私は、テーブルのSONGSにテーブル評価欄rating_averageを挿入する必要がトリガーは、別のテーブルの行を更新する

SELECT *, (tab.rating_sum/tab.rating_count) as rating_average FROM 
(SELECT song_id, COUNT(rating) rating_count, SUM(rating) rating_sum FROM ratings 
GROUP BY song_id) tab 

INNER JOIN SONGS WHERE SONGS.id = tab.song_id 

とき新しい評価が評価に挿入されます。私はまたそれが適切なsong_id列に入ることを確認する必要があります。トリガーでこれをどうすればいいですか?私は私の髪をリッピングしています。 |

定格:

これは私が思い付くことができる最善の方法ですが、私は、トリガーをやっている何は考えていません:

CREATE TRIGGER rating_trig ON ratings FOR INSERT AS 
BEGIN 
UPDATE SONGS SET 
rating = SELECT (tab.rating_sum/tab.rating_count) as rating_average FROM 
(SELECT song_id, COUNT(rating) rating_count, SUM(rating) rating_sum FROM ratings 
GROUP BY song_id) tab 

INNER JOIN SONGS WHERE SONGS.id = tab.song_id 
END 

テーブルレイアウトをsong_id、評価、ユーザー名 SONGS | ID、評価、SONG_NAME

+0

何も進歩していないので、私が試したことはすべて覚えていません。私は誰かが私に何をする必要があるかもしれないかの基本的なレイアウトを与えることを望んでいた。 –

+0

私はベストエフェクトを追加しました –

答えて

3

この1のようなテーブル構造を仮定:

delimiter $$ 

create trigger bi_song before insert on test.song 
for each row 
begin 
    set NEW.rating_sum = 0; 
    set NEW.rating_count = 0; 
    set NEW.rating_avg = NULL; 
end 
$$ 

create trigger ai_rating after insert on test.rating 
for each row 
begin 
    update song set 
    rating_sum = rating_sum + NEW.rating, 
    rating_count = rating_count + 1, 
    rating_avg = rating_sum/rating_count 
    where song_id = NEW.song_id; 
end 
$$ 
delimiter ; 

そして、それは次のように動作するはずです::

use test; 

create table song(
    song_id integer, 
    rating_avg double, 
    rating_sum integer, 
    rating_count integer); 

create table rating(
    song_id integer, 
    user_id integer, 
    rating integer); 

は、次のトリガを定義し

mysql> insert into song(song_id) values (1); 
Query OK, 1 row affected (0.06 sec) 

mysql> select * from song; 
+---------+------------+------------+--------------+ 
| song_id | rating_avg | rating_sum | rating_count | 
+---------+------------+------------+--------------+ 
|  1 |  NULL |   0 |   0 | 
+---------+------------+------------+--------------+ 
1 row in set (0.00 sec) 

mysql> insert into rating(song_id, user_id, rating) values (1, 1000, 5); 
Query OK, 1 row affected (0.05 sec) 

mysql> select * from song; 
+---------+------------+------------+--------------+ 
| song_id | rating_avg | rating_sum | rating_count | 
+---------+------------+------------+--------------+ 
|  1 |   5 |   5 |   1 | 
+---------+------------+------------+--------------+ 
1 row in set (0.00 sec) 

mysql> insert into rating(song_id, user_id, rating) values (1, 1001, 7); 
Query OK, 1 row affected (0.05 sec) 

mysql> select * from song; 
+---------+------------+------------+--------------+ 
| song_id | rating_avg | rating_sum | rating_count | 
+---------+------------+------------+--------------+ 
|  1 |   6 |   12 |   2 | 
+---------+------------+------------+--------------+ 
1 row in set (0.00 sec) 

をこれは非常に単純化され、トリガーを操作する方法を説明するだけです。 実際のアプリケーションでは、もっと多くの列やインデックスなどがあります。

+0

これは素晴らしいです。最初のトリガーは正確に何をしますか?それらのデフォルト値が0の場合、その1つを残すことはできますか?私はすでにそのテーブルにトリガを持っており、別のものを作成することはできません –

+0

ここにはコンテキストのメッセージがあります:#1235 - このバージョンのMySQLは、同じアクション時間とイベントを持つ複数のトリガをサポートしていませんテーブル ' –

+0

実際にはデフォルト値が0の場合は、エラーを取り除くためにSONGSの後のINSERTに変更できますか? –

関連する問題