MySQL实现类似于connect_by_isleaf的功能MySQL方法或存储过程
发布时间 - 2026-01-10 22:52:32 点击率:次最近有个特别变态的业务需求,有一张表
CREATE TABLE `demo` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `tid` int(11) DEFAULT '0', `pid` int(11) DEFAULT '1', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3000124 DEFAULT CHARSET=utf8;
大概就是这样,有300多万行记录,每个pid记录的这个ID的最顶级分类,tid是它的上级分类!
现在需求是:通过指定一个ID,查找出它的所有子集成员,并修改这个pid的值为新指定的值!!
在PHP中跑了一下,执行时间大概需要50秒+,很是痛苦!!!
需要递归找出所有子集,修改它的pid,工作量还是蛮大的。
而oracle中有一个方法是connect_by_isleaf,可以很方便的找出所有子集,但我是MySQL......
所以用这儿简单的写写用MySQL的方法或存储过程实现的经验
第一种:MySQL的方法
CREATE DEFINER=`root`@`localhost` FUNCTION `lvtao_demo_a`(rootId int) RETURNS text CHARSET utf8 READS SQL DATA COMMENT 'demo' BEGIN DECLARE sTemp text; DECLARE sTempChd text; SET sTempChd =cast(rootId as CHAR); SET sTemp = ''; WHILE sTempChd is not null DO SET sTemp = concat(sTemp,',',sTempChd); SELECT group_concat(id) INTO sTempChd FROM demo where FIND_IN_SET(tid,sTempChd)>0; END WHILE; RETURN sTemp; END;
使用方法就是
select lvtao_demo_a(5);
但我在测试的时候,300万的数据基本上就是崩溃!!!
Data too long for column 'sTemp' at row 1
优点: 简单,方便,没有递归调用层次深度的限制 (max_sp_recursion_depth,最大255) ;
缺点:长度受限。
第二种:存储过程+中间表
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `sss`(IN pid int, IN rootid int)
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE id TEXT;
DECLARE cur1 CURSOR FOR SELECT id FROM demo WHERE tid=pid;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
set max_sp_recursion_depth = 200;
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO id;
IF done THEN
LEAVE read_loop;
END IF;
INSERT INTO temp (rootid,zid) values (rootid, id);
call sss(id,rootid);
END LOOP;
CLOSE cur1;
END;;
DELIMITER ;
哈哈,300万数据也卡成球了~~~
再想办法吧~~~~不折腾了
# MySQL
# connect_by_isleaf
# Linux 下mysql通过存储过程实现批量生成记录
# Mybatis调用MySQL存储过程的简单实现
# MySQL与Oracle差异比较之五存储过程&Function
# mysql 存储过程判断重复的不插入数据
# Java实现调用MySQL存储过程详解
# 在Mysql数据库里通过存储过程实现树形的遍历
# MySQL存储过程的优化实例
# 实例解析MySQL中的存储过程及存储过程的调用方法
# mysql的存储过程、游标 、事务实例详解
# 递归
# 存储过程
# 我是
# 我在
# 有个
# 中有
# 执行时间
# 跑了
# 很方便
# 第二种
# 第一种
# 值为
# 再想
# CLOSE
# PHP
# call
# values
# 也卡成球
# 多万行
# br
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在Windows虚拟主机上快速搭建网站?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
如何用好域名打造高点击率的自主建站?
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
如何在万网开始建站?分步指南解析
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
如何快速建站并高效导出源代码?
Laravel中的Facade(门面)到底是什么原理
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
Python自动化办公教程_ExcelWordPDF批量处理案例
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
千库网官网入口推荐 千库网设计创意平台入口
如何自定义建站之星模板颜色并下载新样式?
简历在线制作网站免费版,如何创建个人简历?
用v-html解决Vue.js渲染中html标签不被解析的问题
如何在阿里云域名上完成建站全流程?
Laravel怎么在Controller之外的地方验证数据
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
简历没回改:利用AI润色让你的文字更专业
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
Laravel如何发送系统通知?(Notification渠道示例)
Laravel如何使用Blade模板引擎?(完整语法和示例)
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
PythonWeb开发入门教程_Flask快速构建Web应用
Java解压缩zip - 解压缩多个文件或文件夹实例
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
如何在万网自助建站中设置域名及备案?
如何快速选择适合个人网站的云服务器配置?
如何选择可靠的免备案建站服务器?
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
如何快速搭建自助建站会员专属系统?
5种Android数据存储方式汇总
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
如何在Windows环境下新建FTP站点并设置权限?
Swift中swift中的switch 语句
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
详解Android图表 MPAndroidChart折线图
郑州企业网站制作公司,郑州招聘网站有哪些?
如何快速使用云服务器搭建个人网站?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
EditPlus中的正则表达式实战(6)
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案

