it编程 > 数据库 > Mysql

MySQL存储过程之循环遍历查询的结果集详解

6人参与 2025-06-12 Mysql

前言

近来碰到这样一个问题:在生产上导入的数据发现会员的相册数量统计结果与相册中实际的数量不一致的问题。

解决这个问题有两种办法:

若使用第一种办法的话,需要重新发布版本,比较麻烦,再加上领导对发布版本有些抵触,我觉得我们还是使用第二种方式比较快捷。

1. 表结构

测试表结构如下:

create table `member_album` (
  `id` int(11) not null auto_increment comment '数据id',
  `member_id` int(11) default null comment '会员id',
  `file_type` varchar(8) collate utf8mb4_unicode_ci default null comment '文件类型(image:照片;video:视频)',
  `file_id` int(11) default null comment '文件id',
  `file_path` varchar(255) collate utf8mb4_unicode_ci default null comment '文件地址(相对地址)',
  `create_date` datetime default null comment '创建时间',
  `del_flag` tinyint(1) default '0' comment '删除标识(0:正常;1:已删除)',
  primary key (`id`)
) engine=innodb auto_increment=7 default charset=utf8mb4 collate=utf8mb4_unicode_ci comment='会员相册';
create table `member_album_count` (
  `id` int(11) not null auto_increment comment '数据id',
  `member_id` int(11) default null comment '会员id',
  `img_pass_count` int(11) default '0' comment '照片通过的数量',
  `img_verify_count` int(11) default '0' comment '照片审核中的数量',
  `img_fail_count` int(11) default '0' comment '照片未通过的数量',
  primary key (`id`)
) engine=innodb auto_increment=4 default charset=utf8mb4 collate=utf8mb4_unicode_ci comment='会员照片数量表';

测试表数据如下:

会员相册表:

会员相册数量表:

很明显,会员相册数量表中的数据是不对的,例如会员id为10024的照片有3张,而在会员相册数量表中显示的是0张。

2. 存储过程

-- 建立存储过程之前需要判断该存储过程是否存在,若存在则删除
drop procedure if exists update_album_count;
-- 创建存储过程,update_album_count为存储过程名
create procedure update_album_count()
-- 标识存储过程开始
begin
	-- 定义变量
	declare s int default 0;
	declare memberid int;
	declare count int;
	-- 定义游标,并将sql结果集赋值到游标中,report为游标名
	declare report cursor for select member_id, count(member_id)
							  from member_album 
							  group by member_id
							  having count(member_id) > 0
							  order by member_id asc;
	-- 声明当游标遍历完后将标志变量置为某个值
	declare continue handler for not found set s = 1;
	-- 打开游标
	open report;
	-- 将游标中的值赋值给变量,注意:变量名不要与sql返回的列名相同,变量顺序要和sql结果列的顺序一致
	fetch report into memberid, count;
	-- 当s不等于1时,也就是未遍历完时,会一直循环
	while s <> 1 do
	-- 执行业务逻辑
	update member_album_count t set t.img_pass_count = count where t.member_id = memberid;
	-- 当s等于1时代表遍历已完成,退出循环
	fetch report into memberid, count;
	end while;
	-- 关闭游标
	close report;
-- 标识存储过程结束
end;

执行存储过程:

call update_album_count();

此时再来看会员相册数量表数据:

已经正常了!!!

3. 关于存储过程的sql补充

-- 显示存储过程的状态
show procedure status;
-- 查询指定数据库的存储过程名称
select `name` from mysql.proc where db = 'your_db_name' and `type` = 'procedure'

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

您想发表意见!!点此发布评论

推荐阅读

canal实现mysql数据同步的详细过程

06-12

MySQL单条插入与批量插入实现方法及对比分析

06-12

MySQL 中日期相减的完整指南(最新推荐)

06-13

在 MySQL 中使用 Insert Into Select的示例操作

06-13

MySQL主从数据库搭建的实现

06-13

MySQL 中的 LIMIT 语句及基本用法

06-13

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论