MySql整理篇之递归

问题: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、得出结论

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,740评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,841评论 18 139
  • 荐 语 在微信、微博、网游、直播、淘宝……种种网络社交、娱乐、购物当道的时代,我们必须静下来反思:互联网是为我们所...
    天悦刘洋阅读 279评论 0 0
  • 我爱了一个迷似得女人
    G大大白阅读 184评论 0 0
  • 工作中间接管理着十来个文员。其中Y是一毕业、也就是2006年加入到这家公司的。我比Y大十来岁的样子,同在一个办公室...
    死侃脑壳的老妖婆阅读 511评论 0 2