美文网首页
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整理篇之递归

    问题:Mysql递归实现 方式一:存储过程,方式二:函数 CSDN的大侠已经说明得很详细了(点击参考) 本文再其基...

  • 教你如何使用 MySQL8 递归

    之前写过一篇 MySQL通过自定义函数的方式,递归查询树结构,从MySQL 8.0 开始终于支持了递归查询的语法 ...

  • 爬虫分析之数据存储——基于MySQL,Scrapy

    上一篇->爬虫练习之数据整理——基于Pandas上上篇->爬虫练习之数据清洗——基于Pandas 配置MySql ...

  • MySQL

    mysql递归查询组织机构mysql 递归查询 MySQL教程之concat以及group_concat的用法 M...

  • mysql实现递归查询

    mysql中没有提供递归查询的语句,我们通过mysql函数实现这种查询。 对于如下一张表privilege,递归查...

  • P254-字符串的排列

    排列总结: 字符串的全排列和组合算法 1.递归实现 2.非递归实现 qsort函数、sort函数 (精心整理篇) ...

  • Mysql(七) -- 阶段学习总结

    总结 前面整理了差不多六篇Mysql的文章知识,算是对日常公共中遇到的Mysql问题以及原因的一个记录和知识整理,...

  • Python精简入门学习(十)

    Python精简入门学习之递归函数-递归 -递归 -如图所示

  • 递归的实际业务场景之MySQL 递归查询

    喜欢就点个赞呗!源码<--请点击此处查看 引入 当我看到一些评论时,例如下面的样子。我挺好奇这个功能是怎么样做出来...

  • 常见算法

    OC整理递归和排序算法

网友评论

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

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