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

 更新时间:2025年06月12日 14:33:14   作者:xiaomu_a  
这篇文章主要介绍了MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前言

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

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

  • 1:使用程序修正数量不一致的问题
  • 2:使用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'

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL ORDER BY 的实现分析

    MySQL ORDER BY 的实现分析

    总的来说,在 MySQL 中的ORDER BY有两种排序实现方式,一种是利用有序索引获取有序数据,另一种则是通过相应的排序算法,将取得的数据在内存中进行排序
    2012-07-07
  • MySQL导致索引失效的原因及分析

    MySQL导致索引失效的原因及分析

    索引失效的原因主要包括违反最左前缀法则、范围查询、索引列上进行运算操作、字符串不加单引号以及以%开头的like模糊查询,了解这些原因有助于我们更好地使用索引,提高查询效率
    2024-12-12
  • 浅析MySQL并行复制

    浅析MySQL并行复制

    这篇文章主要介绍了MySQL并行复制的相关资料,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-11-11
  • mysql 8.0.19 win10快速安装教程

    mysql 8.0.19 win10快速安装教程

    这篇文章主要为大家详细介绍了mysql 8.0.19 win10快速安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • mysql explain的用法(使用explain优化查询语句)

    mysql explain的用法(使用explain优化查询语句)

    mysql explain可以帮助你检查索引和更好的优化查询语句,今天特地学习了下mysql explain的用法,需要的朋友可以参考下
    2017-01-01
  • Mysql Update批量更新的几种方式

    Mysql Update批量更新的几种方式

    今天小编就为大家分享一篇关于Mysql Update批量更新的几种方式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • mysql 无法联接常见故障及原因分析

    mysql 无法联接常见故障及原因分析

    这篇文章主要介绍了mysql 无法联接常见故障及原因分析,本文是小编日常收集整理的,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-11-11
  • MySQL如何用GROUP BY分组取字段最大值或最新一条

    MySQL如何用GROUP BY分组取字段最大值或最新一条

    这篇文章主要介绍了MySQL如何用GROUP BY分组取字段最大值或最新一条问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • 基于python的mysql复制工具详解

    基于python的mysql复制工具详解

    python-mysql-replication 是基于python实现的 MySQL复制协议工具,我们可以用它来解析binlog 获取日志的insert,update,delete等事件 ,并基于此做其他业务需求。这篇文章主要介绍了基于python的mysql复制工具,需要的朋友可以参考下
    2019-06-06
  • 登录mysql时出现的闪退问题解决

    登录mysql时出现的闪退问题解决

    大家在打开MySQL时,可能会遇到在登陆界面输入密码之后就闪退的这个问题,下面这篇文章主要给大家介绍了关于如何解决登录mysql时出现的闪退问题的相关资料,需要的朋友可以参考下
    2023-05-05

最新评论