文档章节

mysql存储过程之递归查询

geek_light
 geek_light
发布于 2015/04/27 20:00
字数 382
阅读 94
收藏 4

    对一颗树型结构存储的表进行递归查询,使用navicat for mysql 创建存储过程 pro_show_knowledge, 参数 --  IN `rootId` int   ,通过知识点查询所有子节点数据并插入到临时表 tmp_knowledge_data中。

    注意深度的设置 , set max_sp_recursion_depth = 100 ; 这句话必须加上。

函数定义前添加DETERMINISTIC,任务计划添加:

SET GLOBAL event_scheduler = ON;

SET @@global.event_scheduler = ON;

SET GLOBAL event_scheduler = 1;

SET @@global.event_scheduler = 1;


BEGIN
#设置递归查询的层深上限

 set max_sp_recursion_depth = 100;

#创建临时表tmp_knowledge_data,用于存储某个知识点下的所有子节点数据
    CREATE TEMPORARY TABLE IF NOT EXISTS tmp_knowledge_data
			(`id` int(11) NOT NULL,
                          `name` varchar(50) DEFAULT NULL,
                          `pId` int(11) DEFAULT NULL,
                          `create_time` datetime DEFAULT NULL,
                          `modify_time` datetime DEFAULT NULL,
	                  `nDepth` int(11) DEFAULT NULL,
	                  `is_parent` int DEFAULT NULL,
                          PRIMARY KEY (`id`),
                          UNIQUE KEY `id_index` (`id`) USING BTREE,
                          KEY `pid_index` (`pId`) USING BTREE)  ENGINE=InnoDB DEFAULT CHARSET=utf8;

     DELETE FROM tmp_knowledge_data;
     CALL pro_create_childLst(rootId,0);
     select * from tmp_knowledge_data;

END

子节点插入临时表之前判断数据是否为父节点,并将isparent属性存入临时表

BEGIN

#开始循环

	DECLARE done INT DEFAULT 0;
	DECLARE b INT;

	DECLARE cur1 CURSOR FOR SELECT id FROM mooc_si_knowledge_tree where pId=rootId and delete_flag=0;
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

		OPEN cur1;
		FETCH cur1 INTO b;
		if done =0
		THEN
		insert into tmp_knowledge_data (id,name,pId,create_time,modify_time,nDepth,is_parent) 
			(select id,name,pId,create_time,modify_time,nDepth,1 AS is_parent from mooc_si_knowledge_tree where id = rootId);
						 
		ELSE
		insert into tmp_knowledge_data (id,name,pId,create_time,modify_time,nDepth,is_parent) 
			(select id,name,pId,create_time,modify_time,nDepth,0 AS is_parent from mooc_si_knowledge_tree where id = rootId);

		END IF	;

	WHILE done=0 DO
		CALL pro_create_childLst(b,nDepth+1);
			FETCH cur1 INTO b;
	END WHILE;
	        CLOSE cur1;
#循环结束

END


© 著作权归作者所有

共有 人打赏支持
geek_light
粉丝 5
博文 40
码字总数 13761
作品 0
东城
后端工程师
MySQL递归查找存储过程

依然是SQL问题,是上篇博客(http://my.oschina.net/u/1991646/blog/731996)的升级版需求(上篇是查询3层,此次是查询所有):无可避免的最终还是使用了MySQL存储过程。 先说明业务场景:查...

郁极风
2016/08/16
99
0
无限级分类实现思路 (组织树的分级管理)

关于该问题,暂时自己还没有深入研究,在网上找到几种解决方案,各有优缺点。 第一种方案: 使用递归算法,也是使用频率最多的,大部分开源程序也是这么处理,不过一般都只用到四级分类。这种...

bengozhong
2016/09/09
43
0
Oracle to Mysql

这几天领导要求将应用从oracle搬到mysql,倒腾一阵子,数据本身除了blob和number有些问题外,其他都能正常迁移。倒是函数存储过程是个大难题,研究了一下,感觉都是要重写的样子,但是这样工...

厦门王五
2014/05/30
502
6
Mysql 和 Postgresql 对比

Mysql 使用太广泛了,以至于我不得不将一些应用从mysql 迁移到postgresql, 很多开源软件都是以Mysql 作为数据库标准,并且以Mysql 作为抽象基础的,但是具体使用过程中,发现Mysql 有很多问题...

宏哥
2010/12/14
32.8K
63
SQL的递归查找操作

在关系型数据库中,经常会设计一种上级下级关系数据,即数据中保存这上级的ID。如下所示: 数据库一般设计为id和superior_id(父级id)的设计方式,举例如下,数据中的结构数据如下所示: 此...

郁极风
2016/08/12
57
2

没有更多内容

加载失败,请刷新页面

加载更多

实战讲解高并发和秒杀抢购系统设计

互联网特别是电商平台,阿里双11秒杀、还有12306春运抢票、以及平时各种节假日抢购活动等,都是典型的高并发场景。 这类场景最大的特征就是活动周期短,瞬间流量大(高并发),大量的人短期涌...

xtof
20分钟前
0
0
代码质量管理平台-sonarqube

在工作中,往往开发的时候会不怎么注重代码质量的人很多,存在着很多的漏洞和隐患等问题,sonarqube可以进行代码质量的审核,而且十分的残酷。。。。。接下来我们说下怎么安装 进入官网下载:...

落叶清风
22分钟前
4
0
在Ubuntu安装和配置Sphinx

Ubuntu系统默认是配置有sphinx的,先检查一下,别多此一举。。。。。 在开始本指南之前,您需要: 一个Ubuntu 16.04服务器。 sudo的一个非root用户,您可以通过以下设置本教程 。 安装在服务...

阿锋zxf
31分钟前
0
0
Qt编写输入法V2018超级终结版

对于qt嵌入式linux开发人员来说,输入法一直是个鸡肋问题,要么不支持实体键盘同步,要么不能汉字输入,要么不支持网页输入等,这几年通过陆续接触大量的各种输入法应用场景客户,得到真实需...

飞扬青云
42分钟前
0
0
TypeScript基础入门之高级类型的多态的 this类型

转发 TypeScript基础入门之高级类型的多态的 this类型 高级类型 多态的this类型 多态的this类型表示的是某个包含类或接口的子类型。 这被称做F-bounded多态性。 它能很容易的表现连贯接口间的...

durban
49分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部