首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL游标在过程中不取取

问MySQL游标在过程中不取取
EN

Stack Overflow用户
提问于 2011-09-08 23:49:56
回答 1查看 438关注 0票数 0

我有以下表格

专辑:

代码语言:javascript
复制
+----------------+-------------+------+-----+---------+----------------+
| Field          | Type        | Null | Key | Default | Extra          |
+----------------+-------------+------+-----+---------+----------------+
| album_id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| band_id        | int(11)     | YES  | MUL | NULL    |                |
| release_date   | varchar(45) | YES  |     | NULL    |                |
| name           | varchar(45) | YES  |     | NULL    |                |
| format         | varchar(45) | YES  |     | NULL    |                |
| music_genre_id | int(11)     | YES  | MUL | NULL    |                |
| label_id       | int(11)     | YES  | MUL | NULL    |                |
| avg_rating     | float       | YES  |     | NULL    |                |
+----------------+-------------+------+-----+---------+----------------+

和music_ratings

代码语言:javascript
复制
+-----------------+---------+------+-----+---------+----------------+
| Field           | Type    | Null | Key | Default | Extra          |
+-----------------+---------+------+-----+---------+----------------+
| music_rating_id | int(11) | NO   | PRI | NULL    | auto_increment |
| user_id         | int(11) | YES  | MUL | NULL    |                |
| album_id        | int(11) | YES  | MUL | NULL    |                |
| rating          | int(11) | YES  |     | NULL    |                |
+-----------------+---------+------+-----+---------+----------------+

每次插入*music_rating*后,我想更新相册表中的平均评等。我有一个触发装置,这需要一个程序。问题是,该过程不工作,由于某种原因,游标没有从表中获取数据。(我分别打电话给这个程序,以确保它不是触发故障。表已经有几行了,所以不是这样的。)

我的手术很直接,看上去像这样

代码语言:javascript
复制
DELIMITER $$

CREATE PROCEDURE avg_album_calc(IN id_album INT)
BEGIN

    DECLARE done INT DEFAULT 0; 
    DECLARE rating INT; 
    DECLARE cur CURSOR FOR SELECT `rating` FROM `music_ratings` WHERE `album_id`=id_album;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    OPEN cur;   
    SET @ct=0; 
    SET @sm=0;
    REPEAT
        FETCH cur INTO rating;
        IF NOT done
        THEN 
            SET @ct = @ct +1;
            SET @sm = @sm + rating;     
        END IF;

    UNTIL done END REPEAT;
    UPDATE albums SET avg_rating = @sm/@ct WHERE album_id = id_album;
    CLOSE cur;
END$$
DELIMITER ;

在SELECT rating命令之后,我用FETCH cur INTO rating;命令回显游标的结果,结果显示为null。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-09 07:23:06

您不需要在avg_rating表中计算和存储albums。你可以在飞行中计算-

代码语言:javascript
复制
SELECT a.album_id, a.name, AVG(mr.rating) FROM albums a
  LEFT JOIN music_ratings mr
    ON a.album_id = mr.album_id
GROUP BY a.album_id
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7355781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档