欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL存儲(chǔ)過程之循環(huán)遍歷查詢的結(jié)果集詳解

 更新時(shí)間:2025年06月12日 14:33:14   作者:xiaomu_a  
這篇文章主要介紹了MySQL存儲(chǔ)過程之循環(huán)遍歷查詢的結(jié)果集,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

前言

近來碰到這樣一個(gè)問題:在生產(chǎn)上導(dǎo)入的數(shù)據(jù)發(fā)現(xiàn)會(huì)員的相冊(cè)數(shù)量統(tǒng)計(jì)結(jié)果與相冊(cè)中實(shí)際的數(shù)量不一致的問題。

解決這個(gè)問題有兩種辦法:

  • 1:使用程序修正數(shù)量不一致的問題
  • 2:使用MySQL的存儲(chǔ)過程

若使用第一種辦法的話,需要重新發(fā)布版本,比較麻煩,再加上領(lǐng)導(dǎo)對(duì)發(fā)布版本有些抵觸,我覺得我們還是使用第二種方式比較快捷。

1. 表結(jié)構(gòu)

測(cè)試表結(jié)構(gòu)如下:

CREATE TABLE `member_album` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '數(shù)據(jù)ID',
  `member_id` int(11) DEFAULT NULL COMMENT '會(huì)員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 '文件地址(相對(duì)地址)',
  `create_date` datetime DEFAULT NULL COMMENT '創(chuàng)建時(shí)間',
  `del_flag` tinyint(1) DEFAULT '0' COMMENT '刪除標(biāo)識(shí)(0:正常;1:已刪除)',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='會(huì)員相冊(cè)';
CREATE TABLE `member_album_count` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '數(shù)據(jù)ID',
  `member_id` int(11) DEFAULT NULL COMMENT '會(huì)員ID',
  `img_pass_count` int(11) DEFAULT '0' COMMENT '照片通過的數(shù)量',
  `img_verify_count` int(11) DEFAULT '0' COMMENT '照片審核中的數(shù)量',
  `img_fail_count` int(11) DEFAULT '0' COMMENT '照片未通過的數(shù)量',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='會(huì)員照片數(shù)量表';

測(cè)試表數(shù)據(jù)如下:

會(huì)員相冊(cè)表:

會(huì)員相冊(cè)數(shù)量表:

很明顯,會(huì)員相冊(cè)數(shù)量表中的數(shù)據(jù)是不對(duì)的,例如會(huì)員ID為10024的照片有3張,而在會(huì)員相冊(cè)數(shù)量表中顯示的是0張。

2. 存儲(chǔ)過程

-- 建立存儲(chǔ)過程之前需要判斷該存儲(chǔ)過程是否存在,若存在則刪除
DROP PROCEDURE IF EXISTS update_album_count;
-- 創(chuàng)建存儲(chǔ)過程,update_album_count為存儲(chǔ)過程名
CREATE PROCEDURE update_album_count()
-- 標(biāo)識(shí)存儲(chǔ)過程開始
BEGIN
	-- 定義變量
	DECLARE s int DEFAULT 0;
	DECLARE memberId int;
	DECLARE count int;
	-- 定義游標(biāo),并將sql結(jié)果集賦值到游標(biāo)中,report為游標(biāo)名
	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;
	-- 聲明當(dāng)游標(biāo)遍歷完后將標(biāo)志變量置為某個(gè)值
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET s = 1;
	-- 打開游標(biāo)
	OPEN report;
	-- 將游標(biāo)中的值賦值給變量,注意:變量名不要與sql返回的列名相同,變量順序要和sql結(jié)果列的順序一致
	FETCH report INTO memberId, count;
	-- 當(dāng)s不等于1時(shí),也就是未遍歷完時(shí),會(huì)一直循環(huán)
	WHILE s <> 1 DO
	-- 執(zhí)行業(yè)務(wù)邏輯
	UPDATE member_album_count t SET t.img_pass_count = count WHERE t.member_id = memberId;
	-- 當(dāng)s等于1時(shí)代表遍歷已完成,退出循環(huán)
	FETCH report INTO memberId, count;
	END WHILE;
	-- 關(guān)閉游標(biāo)
	CLOSE report;
-- 標(biāo)識(shí)存儲(chǔ)過程結(jié)束
END;

執(zhí)行存儲(chǔ)過程:

CALL update_album_count();

此時(shí)再來看會(huì)員相冊(cè)數(shù)量表數(shù)據(jù):

已經(jīng)正常了?。?!

3. 關(guān)于存儲(chǔ)過程的SQL補(bǔ)充

-- 顯示存儲(chǔ)過程的狀態(tài)
show procedure status;
-- 查詢指定數(shù)據(jù)庫(kù)的存儲(chǔ)過程名稱
select `name` from mysql.proc where db = 'your_db_name' and `type` = 'PROCEDURE'

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MySQL ORDER BY 的實(shí)現(xiàn)分析

    MySQL ORDER BY 的實(shí)現(xiàn)分析

    總的來說,在 MySQL 中的ORDER BY有兩種排序?qū)崿F(xiàn)方式,一種是利用有序索引獲取有序數(shù)據(jù),另一種則是通過相應(yīng)的排序算法,將取得的數(shù)據(jù)在內(nèi)存中進(jìn)行排序
    2012-07-07
  • MySQL導(dǎo)致索引失效的原因及分析

    MySQL導(dǎo)致索引失效的原因及分析

    索引失效的原因主要包括違反最左前綴法則、范圍查詢、索引列上進(jìn)行運(yùn)算操作、字符串不加單引號(hào)以及以%開頭的like模糊查詢,了解這些原因有助于我們更好地使用索引,提高查詢效率
    2024-12-12
  • 淺析MySQL并行復(fù)制

    淺析MySQL并行復(fù)制

    這篇文章主要介紹了MySQL并行復(fù)制的相關(guān)資料,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2020-11-11
  • mysql 8.0.19 win10快速安裝教程

    mysql 8.0.19 win10快速安裝教程

    這篇文章主要為大家詳細(xì)介紹了mysql 8.0.19 win10快速安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • mysql explain的用法(使用explain優(yōu)化查詢語句)

    mysql explain的用法(使用explain優(yōu)化查詢語句)

    mysql explain可以幫助你檢查索引和更好的優(yōu)化查詢語句,今天特地學(xué)習(xí)了下mysql explain的用法,需要的朋友可以參考下
    2017-01-01
  • Mysql Update批量更新的幾種方式

    Mysql Update批量更新的幾種方式

    今天小編就為大家分享一篇關(guān)于Mysql Update批量更新的幾種方式,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • mysql 無法聯(lián)接常見故障及原因分析

    mysql 無法聯(lián)接常見故障及原因分析

    這篇文章主要介紹了mysql 無法聯(lián)接常見故障及原因分析,本文是小編日常收集整理的,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-11-11
  • MySQL如何用GROUP BY分組取字段最大值或最新一條

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

    這篇文章主要介紹了MySQL如何用GROUP BY分組取字段最大值或最新一條問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 基于python的mysql復(fù)制工具詳解

    基于python的mysql復(fù)制工具詳解

    python-mysql-replication 是基于python實(shí)現(xiàn)的 MySQL復(fù)制協(xié)議工具,我們可以用它來解析binlog 獲取日志的insert,update,delete等事件 ,并基于此做其他業(yè)務(wù)需求。這篇文章主要介紹了基于python的mysql復(fù)制工具,需要的朋友可以參考下
    2019-06-06
  • 登錄mysql時(shí)出現(xiàn)的閃退問題解決

    登錄mysql時(shí)出現(xiàn)的閃退問題解決

    大家在打開MySQL時(shí),可能會(huì)遇到在登陸界面輸入密碼之后就閃退的這個(gè)問題,下面這篇文章主要給大家介紹了關(guān)于如何解決登錄mysql時(shí)出現(xiàn)的閃退問題的相關(guān)資料,需要的朋友可以參考下
    2023-05-05

最新評(píng)論