数据库教程:MySQL实现类似于connect_by_isleaf的功能MySQL方法或存储过程分享

最近有个特别变态的业务需求,有一张表

CREATETABLE`demo`( `id`int(11)unsignedNOTNULLAUTO_INCREMENT, `tid`int(11)DEFAULT'0', `pid`int(11)DEFAULT'1', PRIMARYKEY(`id`) )ENGINE=InnoDBAUTO_INCREMENT=3000124DEFAULTCHARSET=utf8;

大概就是这样,有300多万行记录,每个pid记录的这个ID的最顶级分类,tid是它的上级分类!
现在需求是:通过指定一个ID,查找出它的所有子集成员,并修改这个pid的值为新指定的值!!
在PHP中跑了一下,执行时间大概需要50秒+,很是痛苦!!!
需要递归找出所有子集,修改它的pid,工作量还是蛮大的。

而oracle中有一个方法是connect_by_isleaf,可以很方便的找出所有子集,但我是MySQL……

所以用这儿简单的写写用MySQL的方法或存储过程实现的经验

第一种:MySQL的方法

CREATEDEFINER=`root`@`localhost`FUNCTION`lvtao_demo_a`(rootIdint)RETURNStextCHARSETutf8 READSSQLDATA COMMENT'demo' BEGIN DECLAREsTemptext; DECLAREsTempChdtext; SETsTempChd=cast(rootIdasCHAR); SETsTemp=''; WHILEsTempChdisnotnullDO SETsTemp=concat(sTemp,',',sTempChd); SELECTgroup_concat(id)INTOsTempChdFROMdemowhereFIND_IN_SET(tid,sTempChd)>0; ENDWHILE; RETURNsTemp; END;

使用方法就是

selectlvtao_demo_a(5);

但我在测试的时候,300万的数据基本上就是崩溃!!!

Datatoolongforcolumn'sTemp'atrow1

优点:简单,方便,没有递归调用层次深度的限制(max_sp_recursion_depth,最大255);
缺点:长度受限。

第二种:存储过程+中间表

DELIMITER;; CREATEDEFINER=`root`@`localhost`PROCEDURE`sss`(INpidint,INrootidint) BEGIN DECLAREdoneINTDEFAULTFALSE; DECLAREidTEXT; DECLAREcur1CURSORFORSELECTidFROMdemoWHEREtid=pid; DECLARECONTINUEHANDLERFORNOTFOUNDSETdone=TRUE; setmax_sp_recursion_depth=200; OPENcur1; read_loop:LOOP FETCHcur1INTOid; IFdoneTHEN LEAVEread_loop; ENDIF; INSERTINTOtemp(rootid,zid)values(rootid,id); callsss(id,rootid); ENDLOOP; CLOSEcur1; END;; DELIMITER;

哈哈,300万数据也卡成球了~~~

再想办法吧~~~~不折腾了

您可能感兴趣的文章:Linux下mysql通过存储过程实现批量生成记录Mybatis调用MySQL存储过程的简单实现MySQL与Oracle差异比较之五存储过程&Functionmysql存储过程判断重复的不插入数据Java实现调用MySQL存储过程详解在Mysql数据库里通过存储过程实现树形的遍历MySQL存储过程的优化实例实例解析MySQL中的存储过程及存储过程的调用方法mysql的存储过程、游标、事务实例详解

标签: 存储过程 存储 方法 SQL leaf ec connect le

jquery+html5制作超酷的圆盘时钟表

JavaScript将字符串转换为整数的方法

上述就是数据库技术:MySQL实现类似于connect_by_isleaf的功能MySQL方法或存储过程分享的全部内容,如果对大家有所用处且需要了解更多关于mysql数据库学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/dtteaching/912610.html

(0)
上一篇 2021年10月26日
下一篇 2021年10月26日

精彩推荐