MySQL递归查询树状表的子节点、父节点具体实现_Mysql

简介:mysql5.0.94版本,该版本以及较高级的版本(5.5、6等等)尚未支持循环递归查询,和sqlserver、oracle相比,mysql难于在树状表中层层遍历的子节点。本程序重点参考了下面的资料,写了两个sql存储过程,子节点查询算是照搬了,父节点查询是逆思维弄的。

表结构和表数据就不公示了,查询的表user_role,主键是id,每条记录有parentid字段(对应该记录的父节点,当然,一个父节点自然会有一个以上的子节点嘛)

复制代码 代码如下:

CREATE FUNCTION `getChildList`(rootId INT)
RETURNS varchar(1000)
BEGIN
DECLARE sChildList VARCHAR(1000);
DECLARE sChildTemp VARCHAR(1000);
SET sChildTemp =cast(rootId as CHAR);
WHILE sChildTemp is not null DO
IF (sChildList is not null) THEN
SET sChildList = concat(sChildList,',',sChildTemp);
ELSE
SET sChildList = concat(sChildTemp);
END IF;
SELECT group_concat(id) INTO sChildTemp FROM user_role where FIND_IN_SET(parentid,sChildTemp)>0;
END WHILE;
RETURN sChildList;
END;
/*获取子节点*/
/*调用: 1、select getChildList(0) id; 2、select * 5From user_role where FIND_IN_SET(id, getChildList(2));*/

CREATE FUNCTION `getParentList`(rootId INT)
RETURNS varchar(1000)
BEGIN
DECLARE sParentList varchar(1000);
DECLARE sParentTemp varchar(1000);
SET sParentTemp =cast(rootId as CHAR);
WHILE sParentTemp is not null DO
IF (sParentList is not null) THEN
SET sParentList = concat(sParentTemp,',',sParentList);
ELSE
SET sParentList = concat(sParentTemp);
END IF;
SELECT group_concat(parentid) INTO sParentTemp FROM user_role where FIND_IN_SET(id,sParentTemp)>0;
END WHILE;
RETURN sParentList;
END;
/*获取父节点*/
/*调用: 1、select getParentList(6) id; 2、select * From user_role where FIND_IN_SET(id, getParentList(2));*/

弄完了,pm说不要弄存储结构,在java里面多查几次吧。。。存储结构有很多优点,包括加快查询速度、提高安全性等等,但是会加大数据库负荷,很多文章建议结合使用,个人也觉得少用点会好些。

时间: 2025-01-26 20:35:09

MySQL递归查询树状表的子节点、父节点具体实现_Mysql的相关文章

MySQL递归查询树状表的子节点、父节点

简介:mysql5.0.94版本,该版本以及较高级的版本(5.5.6等等)尚未支持循环递归查询,和sqlserver.oracle相比,mysql难于在树状表中层层遍历的子节点.本程序重点参考了下面的资料,写了两个sql存储过程,子节点查询算是照搬了,父节点查询是逆思维弄的. 资料参考:http://blog.csdn.net/ACMAIN_CHM/article/details/4142971#comments 表结构和表数据就不公示了,查询的表user_role,主键是id,每条记录有par

MySQL实现树状所有子节点查询的方法_Mysql

本文实例讲述了MySQL实现树状所有子节点查询的方法.分享给大家供大家参考,具体如下: 在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方便的查了所有当前节点下的所有子节点.但很遗憾,在MySQL的目前版本中还没有对应的功能. 在MySQL中如果是有限的层次,比如我们事先如果可以确定这个树的最大深度是4, 那么所有节点为根的树的深度均不会超过4,则我们可以直接通过left join 来实现. 但很多时候我们无法控制树的深度.这时就需要

SQL Story(十一)--树状表游戏

树状结构的存储与管理,是每一个在关系型数据库平台上工作的程序员早晚都要遇到的问题.说大不大,怎么都能解决,说小不小,处理不好,有的是麻烦等着你.仁者见仁,智者见智,公说公有理,婆说婆有理(谁用机箱砸我?机箱是个好东西,乱丢会摔坏硬盘的,你看我话没说完你又把显示器丢了--),咳咳,好吧,闲话少说,我们从最大路的处理风格谈一谈吧.这里面的大部分内容并非我的独创,从很久很久以前,数据库程序员们就这样做啦. 树状表的结构化表达     在一切开始前,我们先就树状表的表示方式达成一个共识.在关系型数据库中

求从mysql获取树状结构

问题描述 最近在做一个项目 我们是把页面上菜单存放到数据库 所以在加载页面要去读取这个树状结构 求大神给点代码实例 解决方案 1 使用代码进行递归2 使用mysql sql语句,你可以参考http://web.archive.org/web/20110606032941/http://dev.mysql.com/tech-resources/articles/hierarchical-data.html解决方案二:把数据表里的每一行读到后台,然后数据结构的方式建立一颗树.解决方案三:你需要的是在

MySQL中列子查询与行子查询操作的学习教程_Mysql

MySQL 列子查询及 IN.ANY.SOME 和 ALL 操作符的使用MySQL 列子查询 列子查询是指子查询返回的结果集是 N 行一列,该结果通常来自对表的某个字段查询返回. 一个列子查询的例子如下: SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=1) 列子查询中使用 IN.ANY.SOME 和 ALL 操作符 由于列子查询返回的结果集是 N 行一列,因此不能直接使用 = > < >= <

MySQL数据库查看数据表占用空间大小和记录数的方法_Mysql

如果想知道MySQL数据库中每个表占用的空间.表记录的行数的话,可以打开MySQL的 information_schema 数据库.在该库中有一个 TABLES 表,这个表主要字段分别是: TABLE_SCHEMA : 数据库名 TABLE_NAME:表名 ENGINE:所使用的存储引擎 TABLES_ROWS:记录数 DATA_LENGTH:数据大小 INDEX_LENGTH:索引大小 其他字段请参考MySQL的手册,这几个字段对我们来说最有用. 一个表占用空间的大小,相当于是 数据大小 +

devexpress TreeList 获取当前节点父节点的值

问题描述 创建了一个TreeList控件对象,当我获取到当前点击的节点的值,我获取这个节点的父节点,为什么老是获取不了.this.treeList.FoucedColumn.Paretent,,这个指的就是当前焦点节点的父节点对象,为什么就是找不出其父节点的参数值. 解决方案 解决方案二:最好有个简单小列子,几句代码就OK.谢谢坐等大神解决方案三:去官网的demo找找看吧

修改MySQL数据库中表和表中字段的编码方式的方法_Mysql

今天向MySQL数据库中的一张表添加含有中文的数据,可是老是出异常,检查程序并没有发现错误,无奈呀,后来重新检查这张表发现表的编码方式为latin1并且原想可以插入中文的字段的编码方式也是latin1,然后再次仔细观察控制台输出的异常,进一步确定是表和表中字段编码不当造成的,那就修改表和其中对应的字段呗,网上找了一会儿,你别说还真有,执行完sql脚本后果然可以存入中文了,尽管如此还是认为有必要总结一下,古人云:好记性不如烂笔头嘛,呵呵呵. 修改表的编码方式:ALTER TABLE `test`

mysql 一次向表中插入多条数据实例讲解_Mysql

我们先来创建一种表Authors: CREATE TABLE Authors( AuthID SMALLINT NOT NULL PRIMARY KEY, AuthFN VARCHAR(20), AuthMN VARCHAR(20), AuthLN VARCHAR(20) ) ENGINE=INNODB; 然后向表中一次性插入多条数据,sql插入代码如下: INSERT INTO Authors VALUES (1006, 'H', 'S.', 'T'), (1007, 'J', 'C', 'O