问题: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、得出结论
采用临时参数的方式大大提高了效率,数据量大的时候尤为明显。