2012-02-03 2 views
3

Это оператор выбора, который вычисляет средний рейтинг песни в моей базе данныхTrigger для обновления строки в другой таблице

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 

мне нужно вставить столбец rating_average из таблицы РЕЙТИНГОВ в таблице ПЕСНЮ, когда новый рейтинг добавляется в РЕЙТИНГИ. Мне также нужно убедиться, что он попадает в соответствующий столбец 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, рейтинг, имя пользователя ПЕСНИ | идентификатор, рейтинг, SONG_NAME

+0

Я пробовал кучу вещей безрезультатно, я не помню всего, что я пробовал, потому что я не добился какого-либо прогресса. Я надеялся, что кто-то может дать мне базовый макет для того, что мне может понадобиться. –

+0

Я приложил все усилия –

ответ

3

Предполагая структуру таблицы как этот:

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); 

Определить следующие триггеры:

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 ; 

И он должен работать так:

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, чтобы избавиться от ошибки? –

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