• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MySQL实现类似于connect_by_isleaf的功能MySQL方法或存储过程

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

    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万数据也卡成球了~~~

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

    您可能感兴趣的文章:
    • Linux 下mysql通过存储过程实现批量生成记录
    • Mybatis调用MySQL存储过程的简单实现
    • MySQL与Oracle差异比较之五存储过程&Function
    • mysql 存储过程判断重复的不插入数据
    • Java实现调用MySQL存储过程详解
    • 在Mysql数据库里通过存储过程实现树形的遍历
    • MySQL存储过程的优化实例
    • 实例解析MySQL中的存储过程及存储过程的调用方法
    • mysql的存储过程、游标 、事务实例详解
    上一篇:navicat中创建存储过程、触发器和使用游标的简单实例(图文)
    下一篇:MySQL的查询计划中ken_len的值计算方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    MySQL实现类似于connect_by_isleaf的功能MySQL方法或存储过程 MySQL,实现,类似于,connect,