背景说明

需求:MySQL树形结构, 根据指定的节点,获取其所在全路径节点序列。

问题分析

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

2、直接自定义MySQL函数 getFullPathNodeList,通过两个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、编写查询全路径节点函数 getFullPathNodeList,如下:

CREATE DEFINER=`root`@`localhost` FUNCTION `getFullPathNodeList`(`nodeId` int) RETURNS varchar(1000) CHARSET utf8
BEGIN ################## 声明父序列变量 ###################
DECLARE parentList VARCHAR(1000); # 返回父节点结果集
DECLARE tempParent VARCHAR(1000); # 临时存放父节点 ################## 声明子序列变量 ###################
DECLARE childList VARCHAR(1000); # 返回叶子节点结果集
DECLARE tempChild VARCHAR(1000); # 临时存放子节点 ################## 查询父节点序列 ###################
SET parentList = '';
SET tempParent = CAST(nodeId as CHAR); # 将int类型转换为String WHILE tempParent is not null DO # 循环,用于查询节点上所有的父节点
SET parentList = CONCAT(parentList, ',', tempParent); # 存入到返回结果中
SELECT parent_uuid INTO tempParent FROM t_tree where uuid = tempParent; # 查询节点上所有父节点
END WHILE;
#RETURN SUBSTRING(parentList, LENGTH(SUBSTRING_INDEX(parentList, ',', 2)) + 2);
SET parentList = SUBSTRING(parentList, LENGTH(SUBSTRING_INDEX(parentList, ',', 2)) + 2); ################## 查询子节点序列 ###################
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); # 将返回结果处理,截取掉结果集前面的逗号
SET childList = SUBSTRING(childList, 2);
RETURN CONCAT(parentList, ',' , childList);
END

其中,用到了很多MySQL的系统函数,如:CAST,SUBSTRING,CONCAT,LENGTH,SUBSTRING_INDEX,GROUP_CONCAT,FIND_IN_SET。

 3、调用函数

select getFullPathNodeList(1) as fullPathNodeList;

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

1)查询节点1 所在全路径节点:从树形图可以看到,应该是 0,1,11,12

2)查询节点223 所在全路径节点:从树形图可以看到,应该是 22,2,0,223,2231,2232

3)查询节点2231 所在全路径节点:从树形图可以看到,应该是 223,22,2,0,2231

问题总结

该问题核心点把问题拆分成两个循环,分别查找父节点和子节点,按照上面的表数据和截图,阅读SQL函数,很好理解。

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

 PS:

1)如果需要 根据指定的节点,获取其下属的所有子节点(包含路径上的所有枝干节点和叶子节点)

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

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

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

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

MySQL 树形结构 根据指定节点 获取其所在全路径节点序列的更多相关文章

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

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

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

    背景说明 需求:MySQL树形结构, 根据指定的节点,获取其下属的所有子节点(包含路径上的枝干节点和叶子节点) 枝干节点:如果一个节点下还有子节点,则为枝干节点. 叶子节点:如果一个节点下不再有子节点 ...

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

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

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

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

  5. mysql树形结构递归查询

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

  6. MySql/Oracle树形结构查询

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

  7. java 实现树形结构

    package tree; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java ...

  8. tree:以树形结构显示目录下的内容

    tree命令 1.命令详解 [功能说明] tree命令的中文意思为“树”,功能是以树形结构列出指定目录下的所有内容包括所有文件.子目录及子目录里的目录和文件. [语法格式] tree [option] ...

  9. 026 hibernate操作树形结构

    树形结构:也就是目录结构,有父目录.子目录.文件等信息,而在程序中树形结构只是称为节点. 一棵树有一个根节点,而根节点也有一个或多个子节点,而一个子节点有且仅有一个父节点(当前除根节点外),而且也存在 ...

随机推荐

  1. SQL注入--盲注及报错注入

    盲注查询 盲注其实就是没有回显,不能直观地得到结果来调整注入数据,只能通过其他方式来得到是否注入成功,主要是利用了一些数据库内置函数来达到的 布尔盲注 布尔很明显Ture跟Fales,也就是说它只会根 ...

  2. Acwing-274-移动服务(DP)

    链接: https://www.acwing.com/problem/content/276/ 题意: 一个公司有三个移动服务员,最初分别在位置1,2,3处. 如果某个位置(用一个整数表示)有一个请求 ...

  3. 【Layui】当Layui数据表格和Layui下拉框组合时发生的问题

    关于Layui数据表格用下拉框显示问题 如图所示 可以看见当点击下拉框时下拉选项被下拉框覆盖 此时你需要在数据表格渲染完成时的回调内添加如下代码即可 $(".sel_scrq"). ...

  4. (转)CSS定义字体间距 字体行与行间距

    源网址:http://www.cnblogs.com/jian1982/archive/2010/07/03/1770349.html CSS定义字体行间距 line-height:xxpx; CSS ...

  5. CF1101D GCD Counting 点分治+质因数分解

    题意:求最长的树上路径点值的 $gcd$ 不为 $1$ 的长度. 由于只要求 $gcd$ 不为一,所以只要 $gcd$ 是一个大于等于 $2$ 的质数的倍数就可以了. 而我们发现 $2\times 1 ...

  6. 2018 焦作网络赛 L Poor God Water ( AC自动机构造矩阵、BM求线性递推、手动构造矩阵、矩阵快速幂 )

    题目链接 题意 : 实际上可以转化一下题意 要求求出用三个不同元素的字符集例如 { 'A' .'B' .'C' } 构造出长度为 n 且不包含 AAA.BBB CCC.ACB BCA.CAC CBC ...

  7. ant design 的表格默认选中

    在使用 ant design 的表格时候使用默认选中项, 需要配置的 Table 的 rowSelection const rowSelection = { type: 'checkbox', get ...

  8. windows基础提权

    Window基础提权 提到system权限 甚至让他变成你的肉鸡 我们了解一下windows下面有那些用户 Guests是用户最低的权限 而且一般是被禁用的 User权限也很低 连关机都不行 还有wi ...

  9. sklearn.model_selection Part 2: Model validation

    1. check_cv() def check_cv(cv=3, y=None, classifier=False): if cv is None: cv = 3 if isinstance(cv, ...

  10. 翻译 | 上手 Webpack ? 这篇就够了!

    译者:小 boy (沪江前端开发工程师) 本文原创,转载请注明作者及出处. 原文地址:https://www.smashingmagazine.com/2017/02/a-detailed-intro ...