描述:最近遇到了一个问题,在mysql中如何完成节点下的所有节点或节点上的所有父节点的查询? 在Oracle中我们知道有一个Hierarchical Queries可以通过CONNECT BY来查询,但是,在MySQL中还没有对应的函数!!! 下面给出一个function来完成的方法 下面是sql脚本,想要运行的直接赋值粘贴进数据库即可。

好记性不如烂笔头
下面给出一个function来完成的方法

下面是sql脚本,想要运行的直接赋值粘贴进数据库即可。

创建表treenodes(可以根据需要进行更改)


– Table structure for treenodes


DROP TABLE IF EXISTS treenodes;
CREATE TABLE treenodes (
id int(11) NOT NULL,
nodename varchar(20) DEFAULT NULL,
pid int(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


– Table structure for treenodes


插入几条数据


– Records of treenodes


INSERT INTO treenodes VALUES (‘’, ‘A’, ‘’);
INSERT INTO treenodes VALUES (‘’, ‘B’, ‘’);
INSERT INTO treenodes VALUES (‘’, ‘C’, ‘’);
INSERT INTO treenodes VALUES (‘’, ‘D’, ‘’);
INSERT INTO treenodes VALUES (‘’, ‘E’, ‘’);
INSERT INTO treenodes VALUES (‘’, ‘F’, ‘’);
INSERT INTO treenodes VALUES (‘’, ‘G’, ‘’);
INSERT INTO treenodes VALUES (‘’, ‘H’, ‘’);
INSERT INTO treenodes VALUES (‘’, ‘I’, ‘’);
INSERT INTO treenodes VALUES (‘’, ‘J’, ‘’);
INSERT INTO treenodes VALUES (‘’, ‘K’, ‘’);
INSERT INTO treenodes VALUES (‘’, ‘L’, ‘’);
INSERT INTO treenodes VALUES (‘’, ‘M’, ‘’);
INSERT INTO treenodes VALUES (‘’, ‘N’, ‘’);
INSERT INTO treenodes VALUES (‘’, ‘O’, ‘’);
INSERT INTO treenodes VALUES (‘’, ‘P’, ‘’);
INSERT INTO treenodes VALUES (‘’, ‘Q’, ‘’);

把下面的语句直接粘贴进命令行执行即可(注意修改传入的参数,默认rootId,表明默认treenodes)

根据传入id查询所有父节点的id

delimiter //
CREATE FUNCTION `getParList`(rootId INT)
RETURNS varchar()
BEGIN
DECLARE sTemp VARCHAR();
DECLARE sTempPar VARCHAR();
SET sTemp = '';
SET sTempPar =rootId; #循环递归
WHILE sTempPar is not null DO
#判断是否是第一个,不加的话第一个会为空
IF sTemp != '' THEN
SET sTemp = concat(sTemp,',',sTempPar);
ELSE
SET sTemp = sTempPar;
END IF;
SET sTemp = concat(sTemp,',',sTempPar);
SELECT group_concat(pid) INTO sTempPar FROM treenodes where pid<>id and FIND_IN_SET(id,sTempPar)>;
END WHILE; RETURN sTemp;
END
//
 

执行命令

select * from treenodes where FIND_IN_SET(id,getParList(15));
结果:

 
根据传入id查询所有子节点的id

delimiter //
CREATE FUNCTION `getChildList`(rootId INT)
RETURNS varchar() BEGIN
DECLARE sTemp VARCHAR();
DECLARE sTempChd VARCHAR(); SET sTemp = '$';
SET sTempChd =cast(rootId as CHAR); WHILE sTempChd is not null DO
SET sTemp = concat(sTemp,',',sTempChd);
SELECT group_concat(id) INTO sTempChd FROM treeNodes where FIND_IN_SET(pid,sTempChd)>;
END WHILE;
RETURN sTemp;
END
//

执行命令

select * from treenodes where FIND_IN_SET(id,getChildList(7));
结果:

mysql 层级结构查询的更多相关文章

  1. mysql 查询表结构 查询索引

    首先进入到mysql里 show databases; 选择数据库 use xxxcms; 查询数据库下的表结构 show create table 表名; 这样看着不太好可以后面加\G show c ...

  2. Oracle connect by 层级结构查询

    公司组织架构表:organization 一.查询子级 select * from organizationstart with id='1'connect by prior id = parent_ ...

  3. MySQL递归查询所有子节点,树形结构查询

    --表结构 CREATE TABLE `address` ( `id` int(11) NOT NULL AUTO_INCREMENT, `code_value` varchar(32) DEFAUL ...

  4. SQL查询无限层级结构的所有下级,所有上级

    无限层级结构的table1表,Id(主键),ParentId(父级id)查询某个Id的所有下级或所有上级,使用WITH AS,UNION ALL 查询 1.查询Id为1所有的下级 WITH T AS( ...

  5. MySql/Oracle树形结构查询

    Oracle树形结构递归查询 在Oracle中,对于树形查询可以使用start with ... connect by select * from treeTable start with id='1 ...

  6. MySQL常用表结构查询语句

    在我们使用数据库进行查询或者建表时,经常需要查看表结构,下面以employees数据库中的departments表为例进行表结构查询: departments表:(2列9行) +---------+- ...

  7. 【MySQL】MySQL层级数据的递归遍历

    层级的业务数据在系统中很常见,如组织机构.商品品类等. 如果要获取层级数据的全路径,除了缓存起来,就是递归访问的方式了: 将层级数据缓存在redis中,用redis递归获取层级结构.此方法效率高. 在 ...

  8. 温故知新-Mysql索引结构&页&聚集索引&非聚集索

    文章目录 摘要 索引 索引概述 索引优势劣势 索引结构 BTREE 结构 B+TREE 结构 页 索引分类 索引语法 索引设计原则 聚触索引 & 非聚触索引 你的鼓励也是我创作的动力 Post ...

  9. 一天五道Java面试题----第七天(mysql索引结构,各自的优劣--------->事务的基本特性和隔离级别)

    这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 1 .mysql索引结构,各自的优劣 2 .索引的设计原则 3 .mysql锁的类型有哪些 4 .mysql执行计划怎么看 ...

随机推荐

  1. Jemeter学习环境部署。

    本文档中所有软件的下载地址 链接:https://pan.baidu.com/s/1RREUwlH7GtYMUWeiRjtWVg 提取码:zmjy 一.安装jdk 下载网盘中的jdk 双击jdk-8u ...

  2. Python基础8

    jupyter notebook 安装目录插件, 步骤

  3. JavaScript---js语法,数据类型及方法, 数组及方法,JSON对象及方法,日期Date及方法,正则及方法,数据类型转换,运算符, 控制流程(三元运算),函数(匿名函数,自调用函数)

    day46 一丶javascript介绍 JavaScript的基础分为三个       1.ECMAScript:JavaScript的语法标准.包括变量,表达式,运算符,函数,if语句,for语句 ...

  4. centos7安装jenkins以及jenkins正常启动无法访问问题

    1.安装jdk yum search java|grep jdk sudo yum install -y java-1.8.0-openjdk 2.下载jenkins wget http://pkg. ...

  5. 编写可维护的JavaScript-随笔(四)

    避免使用全局变量 一.全局变量带来的问题 a)      命名冲突 i.          当全局变量和全局函数越来越多时,发生命名冲突的概率也随之增高 ii.          如果函数中使用了外部 ...

  6. Python人工智能常用库Numpy使用入门

    第一章 jupyter notebook简单教程 命令模式按键esc开启 Enter : 转入编辑模式 Shift-Enter : 运行本单元,选中下个单元 Ctrl-Enter : 运行本单元 Al ...

  7. day 39

    ORM 对象关系映射 表 ---> 类 字段 ---> 属性 记录 ---> 对象 优点: ​ 使用者无需关心具体的SQL命令如何编写. ​ 直接通过调用方法,来执行相对应的SQL命 ...

  8. NumPy 之 存储文件和线性代数

    import numpy as np File Input and Output NumPy is able to save and load data to and from disk either ...

  9. IDEA编码时卡顿问题

    当代码行数超过2000行,甚至更多时会出现编码时卡顿到无法编译的情况,解决方法如下: 方法1:修改IDEA配置参数 找到D:\ideaIU-2019.1.1.win\bin\idea64.exe.vm ...

  10. ShareSDK For Unity集成

    Mob ShareSDK Android - V2.7.10 iOS - V3.5.0 Mob下载:https://github.com/MobClub/New-Unity-For-ShareSDK ...