背景说明

需求:MySQL树形结构, 根据指定的节点,获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)

枝干节点:如果一个节点下还有子节点,则为枝干节点。

叶子节点:如果一个节点下不再有子节点,则为叶子节点。

问题分析

1、可以使用类似Java这种面向对象的语言,对节点集合进行逻辑处理,获取所有子节点。

2、直接自定义MySQL函数 getChildList,通过一层while循环,实现对指定节点的所有子节点进行查询。

功能实现

1、创建数据表

1)表结构截图如下(此处简单建一张表 t_tree,id主键自增,uuid表示本节点,parent_uuid表示父节点):

2)建表语句如下:

/*
Navicat Premium Data Transfer Source Server : localhost
Source Server Type : MySQL
Source Server Version : 50724
Source Host : localhost:3306
Source Schema : test_db Target Server Type : MySQL
Target Server Version : 50724
File Encoding : 65001 Date: 07/05/2019 21:04:57
*/ SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0; -- ----------------------------
-- Table structure for t_tree
-- ----------------------------
DROP TABLE IF EXISTS `t_tree`;
CREATE TABLE `t_tree` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`uuid` int(20) NULL DEFAULT NULL,
`parent_uuid` int(20) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ----------------------------
-- Records of t_tree
-- ----------------------------
INSERT INTO `t_tree` VALUES (1, 1, 0);
INSERT INTO `t_tree` VALUES (2, 2, 0);
INSERT INTO `t_tree` VALUES (3, 3, 0);
INSERT INTO `t_tree` VALUES (4, 11, 1);
INSERT INTO `t_tree` VALUES (5, 12, 1);
INSERT INTO `t_tree` VALUES (6, 21, 2);
INSERT INTO `t_tree` VALUES (7, 22, 2);
INSERT INTO `t_tree` VALUES (8, 211, 21);
INSERT INTO `t_tree` VALUES (9, 221, 22);
INSERT INTO `t_tree` VALUES (10, 222, 22);
INSERT INTO `t_tree` VALUES (11, 223, 22);
INSERT INTO `t_tree` VALUES (12, 2231, 223);
INSERT INTO `t_tree` VALUES (13, 2232, 223);
INSERT INTO `t_tree` VALUES (14, 0, ); SET FOREIGN_KEY_CHECKS = 1;

3)表数据结构如下:

4)树形结构如下图:

2、编写查询叶子节点函数 getChildList,如下:

CREATE DEFINER=`root`@`localhost` FUNCTION `getChildList`(`nodeId` int) RETURNS varchar(1000) CHARSET utf8
BEGIN
DECLARE childList VARCHAR(1000); # 返回叶子节点结果集
DECLARE tempChild VARCHAR(1000); # 临时存放子节点 SET childList = '';
SET tempChild = CAST(nodeId as CHAR); # 将int类型转换为String WHILE tempChild is not null DO # 循环,用于查询节点下所有的子节点
SET childList = CONCAT(childList, ',', tempChild); # 存入到返回结果中
SELECT GROUP_CONCAT(uuid) INTO tempChild FROM t_tree where FIND_IN_SET(parent_uuid, tempChild) > 0; # 查询节点下所有子节点
END WHILE;
RETURN SUBSTRING(childList, 2); # 将返回结果处理,截取掉结果集前面的逗号
END

其中,用到了几个MySQL的系统函数,如:CASTCONCATGROUP_CONCATFIND_IN_SET

 3、调用函数

select getChildList(1) as childList;

0)查询节点0 的所有子节点:从树形图可以看到,应该是 0,1,2,3,11,12,21,22,211,221,222,223,2231,2232

1)查询节点1 的所有子节点:从树形图可以看到,应该是 1,11,12

2)查询节点2 的所有子节点:从树形图可以看到,应该是 2,21,22,211,221,222,223,2231,2232

3)查询节点3 的所有子节点:从树形图可以看到,应该是 3

问题总结

该问题核心点循环遍历查找子节点,按照上面的表数据和截图,阅读SQL函数,很好理解。

希望能帮到需要帮助的同行,谢谢。

 PS:

1)如果需要 根据指定的节点,获取其下属的所有叶子节点(只包含叶子节点)

请参考本人的另一篇博文:https://www.cnblogs.com/miracle-luna/p/10828476.html

2)如果需要 根据指定节点,获取其所有父节点序列
请参考本人的另一篇博文:https://www.cnblogs.com/miracle-luna/p/10878224.html

3)如果需要 根据指定节点,获取其所在全路径节点序列

请参考本人的另一篇博文:https://www.cnblogs.com/miracle-luna/p/10878366.html

MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)的更多相关文章

  1. MySQL 树形结构 根据指定节点 获取其所在全路径节点序列

    背景说明 需求:MySQL树形结构, 根据指定的节点,获取其所在全路径节点序列. 问题分析 1.可以使用类似Java这种面向对象的语言,对节点集合进行逻辑处理,获取全路径节点序列. 2.直接自定义My ...

  2. MySQL 树形结构 根据指定节点 获取其所有父节点序列

    背景说明 需求:MySQL树形结构, 根据指定的节点,获取其所有父节点序列. 问题分析 1.可以使用类似Java这种面向对象的语言,对节点集合进行逻辑处理,获取父节点. 2.直接自定义MySQL函数  ...

  3. MySQL 树形结构 根据指定节点 获取其所有叶子节点

    背景说明 需求:MySQL树形结构, 根据指定的节点,获取其下属的所有叶子节点. 叶子节点:如果一个节点下不再有子节点,则为叶子节点. 问题分析 1.可以使用类似Java这种面向对象的语言,对节点集合 ...

  4. MySQL树形结构的数据库表设计和查询

    1.邻接表(Adjacency List) 实例:现在有一个要存储一下公司的人员结构,大致层次结构如下: 那么怎么存储这个结构?并且要获取以下信息: 1.查询小天的直接上司. 2.查询老宋管理下的直属 ...

  5. C# 使用递归获取所有下属、所有子部门……

    本例中获取的是所有的晚辈!首先定义家庭成员类: public class FamilyMember { /// <summary> /// 身份 /// </summary> ...

  6. 【二叉树-所有路经系列(根->叶子)】二叉树的所有路径、路径总和 II、路径总和、求根到叶子节点数字之和(DFS)

    总述 全部用DFS来做 重点一:参数的设置:为Root,路径字符串,路径List集合. 重点二:步骤: 1 节点为null 2 所有节点的操作 3 叶子结点的操作 4 非叶节点的操作 题目257. 二 ...

  7. mysql树形结构递归查询

    之前一直用的是Oracle,对于树形查询可以使用start with ... connect by ' connect by id = prior parent_id; 没错,这是Oracle所支持的 ...

  8. MySql/Oracle树形结构查询

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

  9. MySQL 树形索引结构 B树 B+树

    MySQL 树形索引结构 B树 B+树   如何评估适合索引的数据结构 索引的本质是一种数据结构 内存只是临时存储,容量有限且容易丢失数据.因此我们需要将数据放在硬盘上. 在硬盘上进行查询时也就产生了 ...

随机推荐

  1. Charles中使用Rewrite提高测试效率

    上次给大家演示了Charles中通过Map Local功能来提高测试效率,Charles还有另外一个强大的功能,Rewrite,这次也给大家演示一下. Charles中的Rewrite功能非常强大,可 ...

  2. Django的orm练习

    models(创建表): class Grade(models.Model): """年级表""" gname=models.CharFie ...

  3. zabbix的简单操作(proxy代理分布式监控)

    分布式监控 作用:分担压力,减轻负载,多机房监控 通过zabbix proxy的搭建,zabbix server可以远程从proxy获取到数据,这里的环境相当于zabbix server具有一个公网i ...

  4. k8sDaemonSet控制器

    DaemonSet用于再集群中的全部节点上同时运行一份指定的pod资源副本,后续新加入的工作节点也会自动创建一个相关的pod对象,当从集群中移除节点时,此类pod对象也将被自动回收而无须重建.也可以使 ...

  5. supervisor部署tornado

    supervisord常见命令 supervisorctl shutdown 关闭命令 supervisord -c /etc/supervisord.conf 启动supervisord super ...

  6. selenium环境搭建:Error: could not find java.dll 报错问题

    搭建java环境,参照其他的安装步骤,搭建即可. 问题:出现如下报错信息. Error: could not find java.dll Error: Could not find Java SE R ...

  7. 数组遍历 forEach 方法

    数组的遍历 遍历数组,将数组中的所有元素都取出来. 使用for 循环执行数组的索引(length-1)相同的次数. var arr=["1", "5", &qu ...

  8. 1、Qt应用程序

    新建Qt Widgets Application,基类选择QWidget Qt项目特点(参考上图):头文件名与类名一样,成对出现 main.cpp代码解释如下 #include "mywid ...

  9. 八、定制new和delete

    条款49:了解new-handler的行为 new异常会发生什么事? 在旧式的编译器中,operator new分配内存失败的时候,会返回一个null指针.而现在则是会抛出一个异常. 而在抛出这个异常 ...

  10. [pytorch笔记] torch.nn vs torch.nn.functional; model.eval() vs torch.no_grad(); nn.Sequential() vs nn.moduleList

    1. torch.nn与torch.nn.functional之间的区别和联系 https://blog.csdn.net/GZHermit/article/details/78730856 nn和n ...