Mysql 触发器更新另一个表中的行

Mysql 触发器更新另一个表中的行,mysql,Mysql,这是一个select语句,用于计算数据库中歌曲的平均评分 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 在RA

这是一个select语句,用于计算数据库中歌曲的平均评分

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
在RATINGS中插入新评级时,我需要将rating_average列从RATINGS表插入SONGS表。我还需要确保它进入正确的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
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 ;
表格布局:

收视率|宋|id、收视率、用户名
歌曲| id、等级、歌曲名

假设如下表结构:

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);
定义以下触发器:

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
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,我可以省略这个吗?我已经在那个表上有了一个触发器,它不允许我再创建一个。这里是上下文的消息:1235-这个版本的MySQL还不支持“一个表具有相同操作时间和事件的多个触发器”,所以实际上如果默认值为0,那么我可以在插入歌曲后将其更改为以消除错误吗?第一个触发器将字段设置为0/NULL值。song上的AFTER INSERT将不起作用,因为数据需要在写入表之前固定,而不是之后。为列设置默认值也可以,但实际上并不需要触发器。触发器可防止用户插入带有分级值但没有分级的歌曲。关于错误1235,如果在同一个事件和同一个表上有多个触发器,其中包含不同的逻辑片段,则只需定义一个触发器,并将所有逻辑放在一个位置。自由地接受答案;很抱歉,我想出来了。非常感谢。