mysql 层级结构查询
描述:最近遇到了一个问题,在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 层级结构查询的更多相关文章
- mysql 查询表结构 查询索引
首先进入到mysql里 show databases; 选择数据库 use xxxcms; 查询数据库下的表结构 show create table 表名; 这样看着不太好可以后面加\G show c ...
- Oracle connect by 层级结构查询
公司组织架构表:organization 一.查询子级 select * from organizationstart with id='1'connect by prior id = parent_ ...
- MySQL递归查询所有子节点,树形结构查询
--表结构 CREATE TABLE `address` ( `id` int(11) NOT NULL AUTO_INCREMENT, `code_value` varchar(32) DEFAUL ...
- SQL查询无限层级结构的所有下级,所有上级
无限层级结构的table1表,Id(主键),ParentId(父级id)查询某个Id的所有下级或所有上级,使用WITH AS,UNION ALL 查询 1.查询Id为1所有的下级 WITH T AS( ...
- MySql/Oracle树形结构查询
Oracle树形结构递归查询 在Oracle中,对于树形查询可以使用start with ... connect by select * from treeTable start with id='1 ...
- MySQL常用表结构查询语句
在我们使用数据库进行查询或者建表时,经常需要查看表结构,下面以employees数据库中的departments表为例进行表结构查询: departments表:(2列9行) +---------+- ...
- 【MySQL】MySQL层级数据的递归遍历
层级的业务数据在系统中很常见,如组织机构.商品品类等. 如果要获取层级数据的全路径,除了缓存起来,就是递归访问的方式了: 将层级数据缓存在redis中,用redis递归获取层级结构.此方法效率高. 在 ...
- 温故知新-Mysql索引结构&页&聚集索引&非聚集索
文章目录 摘要 索引 索引概述 索引优势劣势 索引结构 BTREE 结构 B+TREE 结构 页 索引分类 索引语法 索引设计原则 聚触索引 & 非聚触索引 你的鼓励也是我创作的动力 Post ...
- 一天五道Java面试题----第七天(mysql索引结构,各自的优劣--------->事务的基本特性和隔离级别)
这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 1 .mysql索引结构,各自的优劣 2 .索引的设计原则 3 .mysql锁的类型有哪些 4 .mysql执行计划怎么看 ...
随机推荐
- Django---Django的中间件
Django---Django的中间件 一丶中间件介绍 什么是中间件 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Dj ...
- 【转载】C#中ArrayList集合类使用Remove方法指定元素对象
ArrayList集合是C#中的一个非泛型的集合类,是弱数据类型的集合类,可以使用ArrayList集合变量来存储集合元素信息,任何数据类型的变量都可加入到同一个ArrayList集合中,在Array ...
- Object-C与标准C/C++混合编程
转自:http://www.xue5.com/Mobile/iOS/661674.html 如何将C++和Object-C混合编程开发IOS软件(Object-c调用C++) 原文网址:http:// ...
- Unity手游汉化笔记③:UABE替换BMFont
总的笔记:https://www.cnblogs.com/guobaoxu/p/12055930.html 目录 一.Demo 二.分析思路 三.替换 四.总结 五.补充 工具: Unity版本:20 ...
- Docker 0x06: Docker Volume卷
目录 Docker Volume卷 一句话什么是docker volume? docker volume特性 docker 挂载卷 docker 多容器间共享数据券 删除,查看数据卷 备份还原数据卷 ...
- ELK提高篇之Logstash
目录 二.Logstash 2.1.安装logstash 2.2.Logstash的工作原理解析 2.3.Logstash的配置和运行 2.4.Logstash实用举例 2.5.Logstash常用插 ...
- 性能测试基础---LR关联
·什么时候需要做关联?一般来说,在脚本运行出错的时候,我们就可能需要进行关联处理. ·脚本出错分为两种情况: ·直接回放出错(失败).通常来说,如果录制成功,回放失败,排除数据的唯一性约束之后,那就必 ...
- Python中取整的方法floor,ceil,round
地板函数:math.floor(4.9)=4 天花板函数: math.ceil(4.1)=5 四舍五入: round(4.5)=4 round(4.6)=5
- php解析xml的几种方式
php提供几种解析xml的类或方法,包括:Xml parser. SimpleXML,.XMLReader,.DOMDocument. XML Expat Parser: XML Parser使用Ex ...
- Ruby for
#!/usr/bin/ruby -w# -*- coding: UTF-8 -*-for i in 1..5 print i," "endprint "\n"f ...