文档章节

mysql存储过程之递归查询

HTCKF
 HTCKF
发布于 2015/04/27 20:00
字数 382
阅读 86
收藏 4
点赞 0
评论 0

    对一颗树型结构存储的表进行递归查询,使用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


© 著作权归作者所有

共有 人打赏支持
HTCKF
粉丝 5
博文 36
码字总数 10749
作品 0
北京
后端工程师
MySQL递归查找存储过程

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

郁极风 ⋅ 2016/08/16 ⋅ 0

无限级分类实现思路 (组织树的分级管理)

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

bengozhong ⋅ 2016/09/09 ⋅ 0

Oracle to Mysql

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

厦门王五 ⋅ 2014/05/30 ⋅ 6

Mysql 和 Postgresql 对比

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

宏哥 ⋅ 2010/12/14 ⋅ 63

SQL的递归查找操作

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

郁极风 ⋅ 2016/08/12 ⋅ 2

MySQL查看数据库、表大小 | 异地备份|存储过程

查看数据库大小 ①进入 information_schema 数据库 ②查看所有数据库大小 i 查看所有数据库大小 select concat(round(sum(datalength/1024/1024), 2),"MB" ) as datasize from tables;+----...

flyking ⋅ 2014/03/12 ⋅ 0

从Oracle迁移到Mysql之前必须知道的50件事

  1、 对子查询的优化表现不佳。   2、 对复杂查询的处理较弱   3、 查询优化器不够成熟   4、 性能优化工具与度量信息不足   5、 审计功能相对较弱   6、 安全功能不成熟,甚至可...

liujie_sun ⋅ 2014/03/04 ⋅ 0

使用mysql 游标,快速删除子节点及其附属节点

上篇,我写了如何使用html展示数据库中存储的树形结构, 本篇我将说一下如何通过存储过程,快速删除一个树节点及其附属节点。网上已经有非常多的关于mysql 游标使用的文章了, 为什么我还要写...

AdaAda ⋅ 2017/06/06 ⋅ 0

MySQL · 新特性分析 · CTE执行过程与实现原理

众所周知,Common table expression(CTE)是在大多数的关系型数据库里都存在的特性,包括ORACLE, SQLSERVER,POSTGRESQL等,唯独开源数据库老大MySQL缺失。CTE作为一个方便用户使用的功能,原本...

阿里云RDS-数据库内核组 ⋅ 2017/02/07 ⋅ 0

如何创建MySQL存储过程可以返回一个表类型的数据?在C#代码中如何调用这样的存储过程?

@飞晏 你好,想跟你请教个问题: 我最近在做实验室的项目,需要考虑些存储过程,想请教您一些MySQL存储过程的问题,麻烦您帮我看一下,万分感谢。 MySQL如何创建可以返回DataTable类型的存储...

hushaod ⋅ 2013/12/04 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

一篇文章学懂Shell脚本

Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用...

Jake_xun ⋅ 26分钟前 ⋅ 0

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 59分钟前 ⋅ 0

Kylin 对维度表的的要求

1.要具有数据一致性,主键值必须是唯一的;Kylin 会进行检查,如果有两行的主键值相同则会报错。 2.维度表越小越好,因为 Kylin 会将维度表加载到内存中供查询;过大的表不适合作为维度表,默...

无精疯 ⋅ 今天 ⋅ 0

58到家数据库30条军规解读

军规适用场景:并发量大、数据量大的互联网业务 军规:介绍内容 解读:讲解原因,解读比军规更重要 一、基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务、行级锁、并发性能更好、CPU及...

kim_o ⋅ 今天 ⋅ 0

代码注释中顺序更改 文件读写换行

`package ssh; import com.xxx.common.log.LogFactory; import com.xxx.common.log.LoggerUtil; import org.apache.commons.lang3.StringUtils; import java.io.*; public class DirErgodic ......

林伟琨 ⋅ 今天 ⋅ 0

linux实用操作命令

参考 http://blog.csdn.net/qwe6112071/article/details/50806734 ls [选项] [目录名 | 列出相关目录下的所有目录和文件 -a 列出包括.a开头的隐藏文件的所有文件-A 同-a,但不列出"."和"...

简心 ⋅ 今天 ⋅ 0

preg_match处理中文符号 url编码方法

之前想过直接用符号来替换,但失败了,或者用其他方式,但有有些复杂,这个是一个新的思路,亲测可用 <?php$str='637朗逸·超速新风王(300)(白光)'; $str=iconv("UTF-8","GBK",$s...

大灰狼wow ⋅ 今天 ⋅ 0

DevOps 资讯 | PostgreSQL 的时代到来了吗 ?

PostgreSQL是对象-关系型数据库,BSD 许可证。拼读为"post-gress-Q-L"。 作者: Tony Baer 原文: Has the time finally come for PostgreSQL?(有删节) 近30年来 PostgreSQL 无疑是您从未听...

RiboseYim ⋅ 今天 ⋅ 0

github太慢

1:用浏览器访问 IPAddress.com or http://tool.chinaz.com 使用 IP Lookup 工具获得github.com和github.global.ssl.fastly.net域名的ip地址 2:/etc/hosts文件中添加如下格式(IP最好自己查一...

whoisliang ⋅ 今天 ⋅ 0

非阻塞同步之 CAS

为解决线程安全问题,互斥同步相当于以时间换空间。多线程情况下,只有一个线程可以访问同步代码。这种同步也叫阻塞同步(Blocking Synchronization). 这种同步属于一种悲观并发策略。认为只...

长安一梦 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部