2012-02-03 3 views
3

이 내 데이터베이스에서 노래의 평균 등급을 계산하는 select 문입니다 제가 테이블 노래에 테이블 등급에서 열 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, rating, username 노래 | ID, 등급, SONG_NAME

+0

아무런 노력을하지 않고 노력했지만 모든 것을 기억하지 못해서 아무런 진전을 이루지 못했습니다. 누군가 내가해야 할 일을 위해 기본적인 레이아웃을 줄 수 있기를 바랬습니다. –

+0

최선을 다했습니다. –

답변

3

이와 같은 테이블 구조를 가정 :

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으로 설정하면 그 값을 그대로 둘 수 있습니까? 나는 이미 그 테이블에 트리거를 가지고 있고 다른 하나를 생성하게하지 않을 것입니다 –

+0

여기에 문맥에 대한 메시지가 있습니다 : # 1235 -이 버전의 MySQL은 '하나의 작업 시간과 이벤트가 동일한 다중 트리거를 아직 지원하지 않습니다. table ' –

+0

그래서 실제로 디폴트 값이 0이라면 에러를 없애기 위해 SONGS INSERT 후에 그것을 변경할 수 있습니까? –

관련 문제