当前位置: 首页 > 知识库问答 >
问题:

MySQL游标avg()提取空

江德润
2023-03-14

我在光标选择查询中有一个计算列。

drop procedure if exists update_avg;
delimiter $$
create procedure update_avg()
BEGIN
    declare score decimal(9,4);
    declare id varchar(5);
    declare done bool default false;
    declare c_update cursor for
    select stu_id, avg(score) from chooses group by stu_id;
    declare continue HANDLER for not found set done = true; 
    open c_update;
    fetch c_update into id, score;
    select id, score; -- test purpose
    while(not done) do
        update student set average_score = score where student_id = id;
        fetch c_update into id, score;
    end while;
    close c_update;
END
delimiter ;

call update_avg();

当我执行这个查询时,它工作得很好:

select stu_id, avg(score) from chooses group by stu_id;
|stu_id|avg(score)|
|------|----------|
|1     |   73.5000|
|10    |   93.0000|
|11    |   53.0000|
...

当我调用update_avg();输出时:

|id|score|
|--|-----|
|1 |NULL |

我的问题是为什么这个光标不能从select查询中提取avg(score)以及如何解决这个问题。

共有1个答案

赵智
2023-03-14

此操作不需要游标,可以使用相关子查询完成:

update student 
set average_score = (SELECT AVG(score) 
                     FROM chooses 
                     WHERE chooses.stu_id = student.student_id)
-- WHERE EXISTS (SELECT 1 FROM chooses WHERE chooses.stu_id = student.student_id)
-- this condition is to avoid updating rows 
-- that do not have corresponding rows in chooses table
 类似资料:
  • 主要内容:1. 声明游标,2. 打开游标,3. 使用游标,4. 关闭游标在 MySQL 中,存储过程或函数中的查询有时会返回多条记录,而使用简单的 SELECT 语句,没有办法得到第一行、下一行或前十行的数据,这时可以使用游标来逐条读取查询结果集中的记录。游标在部分资料中也被称为光标。 关系数据库管理系统实质是面向集合的,在 MySQL 中并没有一种描述表中单一记录的表达形式,除非使用 WHERE 子句来限制只有一条记录被选中。所以有时我们必须借助于游标来进行单条记录

  • 读取文件已支持 windows 系统,版本号大于等于 1.3.4.1; 扩展版本大于等于 1.2.7; PECL 安装时将会提示是否开启读取功能,请键入 yes; 编译 编译时需添加 --enable-reader ./configure --enable-reader 示例一 $config = ['path' => './tests']; $excel = new \Vtiful\

  • 问题内容: 我正在尝试从表中删除很多行。我想尝试将要删除的行放入游标中,然后继续对游标的每一行进行获取,删除,提交操作,直到它为空。 在下面的代码中,我们是行,并将其放入。 我如何修改下面的代码以从图片中删除TYPE,而只是简单地对光标本身进行操作即可。 问题答案: 为什么要分批提交?那只会减慢您的处理速度。除非有其他会话试图修改要删除的行,否则由于其他原因,这似乎是有问题的,最有效的方法是简单地

  • 问题内容: 我在做什么 : 我预期的输出: 平均=(10 + 20 + 30)/ 5 = 12 MYSQL的输出: 平均值=(10 + 20 + 30)/ 3 = 20 理想情况下,我想要的是MYSQL应该得到5行的总和并除以5,但是它只能除以3(非NULL行) 为什么会发生这种情况,我该怎么做才能获得正确的AVG,即60/5?PS:我不能使标记字段NOT NULL,在我的数据库设计中,标记字段允

  • 本文向大家介绍MySql游标的使用实例,包括了MySql游标的使用实例的使用技巧和注意事项,需要的朋友参考一下 mysql游标使用的整个过程为: 1.创建游标 2.打开游标 3.使用游标 4.关闭游标 实例代码如下所示:

  • 我的数据库结构包含列:。我想为每个检索具有最低的行。我一直试图把和搞乱,仍然没有解决方案。