美文网首页
MySql整理篇之递归

MySql整理篇之递归

作者: 山水墨阳 | 来源:发表于2018-03-06 18:18 被阅读0次

    问题:Mysql递归实现

    方式一:存储过程,方式二:函数

    CSDN的大侠已经说明得很详细了(点击参考)

    本文再其基础之上考研效率问题,只在乎实现的同学参考大侠的足矣,想继续提高效率的可继续阅读。再参考博文中,大侠已说明,推介方式二(函数)实现,下面也在方式二的基础之上进行考研。

    1、创建表:t_temp_node

    CREATE TABLE `t_temp_node` (

      `id` decimal(9,0) NOT NULL,

      `fid` decimal(9,0) DEFAULT NULL,

      `node_id` varchar(50) DEFAULT NULL,

      `node_code` varchar(50) DEFAULT NULL,

      `node_name` varchar(50) DEFAULT NULL,

      `son_node_type` varchar(50) DEFAULT NULL,

      `son_node_content` varchar(4000) DEFAULT NULL,

      KEY `ind_t_temp_node` (`id`,`fid`)

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    select n.* from t_temp_node n,(select (@nodes:= queryChildrenTempNode(14593)) as pids) t

    where FIND_IN_SET(n.id,t.pids) order by id;

    2、随便插入多条数据

    insert into `t_temp_node`(`id`,`fid`,`node_id`,`node_code`,`node_name`,`son_node_type`,`son_node_content`) values (14593,null,'28362','PlatformType','PlatformType',null,null);

    insert into `t_temp_node`(`id`,`fid`,`node_id`,`node_code`,`node_name`,`son_node_type`,`son_node_content`) values (14594,14593,'28362','PlatformType','PlatformType',null,null);

    insert into `t_temp_node`(`id`,`fid`,`node_id`,`node_code`,`node_name`,`son_node_type`,`son_node_content`) values (14595,14594,'28362','PlatformType','PlatformType',null,null);

    insert into `t_temp_node`(`id`,`fid`,`node_id`,`node_code`,`node_name`,`son_node_type`,`son_node_content`) values (14596,14594,'28362','PlatformType','PlatformType',null,null);

    insert into `t_temp_node`(`id`,`fid`,`node_id`,`node_code`,`node_name`,`son_node_type`,`son_node_content`) values (14597,14594,'28362','PlatformType','PlatformType',null,null);

    insert into `t_temp_node`(`id`,`fid`,`node_id`,`node_code`,`node_name`,`son_node_type`,`son_node_content`) values (14598,14595,'28362','PlatformType','PlatformType',null,null);

    insert into `t_temp_node`(`id`,`fid`,`node_id`,`node_code`,`node_name`,`son_node_type`,`son_node_content`) values (14599,14595,'28362','PlatformType','PlatformType',null,null);

    insert into `t_temp_node`(`id`,`fid`,`node_id`,`node_code`,`node_name`,`son_node_type`,`son_node_content`) values (14600,14595,'28362','PlatformType','PlatformType',null,null);

    insert into `t_temp_node`(`id`,`fid`,`node_id`,`node_code`,`node_name`,`son_node_type`,`son_node_content`) values (14601,14595,'28362','PlatformType','PlatformType',null,null);

    insert into `t_temp_node`(`id`,`fid`,`node_id`,`node_code`,`node_name`,`son_node_type`,`son_node_content`) values (14602,14595,'28362','PlatformType','PlatformType',null,null);

    insert into `t_temp_node`(`id`,`fid`,`node_id`,`node_code`,`node_name`,`son_node_type`,`son_node_content`) values (14603,14600,'28362','PlatformType','PlatformType',null,null);

    insert into `t_temp_node`(`id`,`fid`,`node_id`,`node_code`,`node_name`,`son_node_type`,`son_node_content`) values (14604,14600,'28362','PlatformType','PlatformType',null,null);

    insert into `t_temp_node`(`id`,`fid`,`node_id`,`node_code`,`node_name`,`son_node_type`,`son_node_content`) values (14605,14600,'28362','PlatformType','PlatformType',null,null);

    3、创建函数:queryChildrenTempNode

    DROP FUNCTION IF EXISTS queryChildrenTempNode;

    CREATE FUNCTION ciim.`queryChildrenTempNode`(p_id int) RETURNS varchar(20000) CHARSET utf8

    BEGIN

    DECLARE sTemp VARCHAR(20000);

    DECLARE sTempChd VARCHAR(5000);

    SET sTemp='$';

    SET sTempChd = CAST(p_id AS CHAR);

    WHILE sTempChd IS NOT NULL DO

    SET sTemp = CONCAT(sTemp,',',sTempChd);

    SELECT GROUP_CONCAT(distinct id) INTO sTempChd FROM t_temp_node WHERE FIND_IN_SET(fid,sTempChd) > 0;

    END WHILE;

    RETURN sTemp;

    END;

    4、验证

    4.1 引用查询

    select queryChildrenTempNode(14593); -- 0.215秒

    4.2 嵌套查询

    select * from t_temp_node where FIND_IN_SET(id,queryChildrenTempNode(14593));--  1.659秒

    4.3 临时参数查询

    select n.* from t_temp_node n,(select (@nodes:= queryChildrenTempNode(14593)) as pids) t

    where FIND_IN_SET(n.id,t.pids);-- 0.215秒

    5、得出结论

    采用临时参数的方式大大提高了效率,数据量大的时候尤为明显。

    相关文章

      网友评论

          本文标题:MySql整理篇之递归

          本文链接:https://www.haomeiwen.com/subject/deerfftx.html