博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL 树形结构 根据指定节点 获取其所有父节点序列
阅读量:4442 次
发布时间:2019-06-07

本文共 2857 字,大约阅读时间需要 9 分钟。

背景说明

需求:MySQL树形结构, 根据指定的节点,获取其所有父节点序列。

 

问题分析

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

2、直接自定义MySQL函数 getParentNodeList,通过一层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、编写查询父节点函数 getParentNodeList,如下:

CREATE DEFINER=`root`@`localhost` FUNCTION `getParentNodeList`(`nodeId` int) RETURNS varchar(1000) CHARSET utf8BEGIN    DECLARE parentList VARCHAR(1000);      # 返回父节点结果集    DECLARE tempParent 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, 2);       # 将返回结果处理,截取掉结果集前面的逗号END

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

 

 3、调用函数

select getParentNodeList(2232) as parentNodeList;

 

0)查询节点0 的父节点:从树形图可以看到,应该是 0

 

1)查询节点21 的父节点:从树形图可以看到,应该是 21,2,0

 

2)查询节点211 的父节点:从树形图可以看到,应该是 211,21,2,0

 

 

3)查询节点2231 的父节点:从树形图可以看到,应该是 2231,223,22,2,0

 

问题总结

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

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

 

 PS:

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

请参考本人的另一篇博文:

 

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

请参考本人的另一篇博文:

 

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

请参考本人的另一篇博文:

转载于:https://www.cnblogs.com/miracle-luna/p/10878224.html

你可能感兴趣的文章
React的性能优化 - 代码拆分之lazy的使用方法
查看>>
在canvas中使用其他HTML元素
查看>>
React的新特性 ---- Hooks ---- 的基本使用
查看>>
History Introduction to Mining Industry of Czech
查看>>
富文本框
查看>>
动态网页开发基础
查看>>
mysql 恢复备份
查看>>
LeetCode-Create Maximum Number
查看>>
随想之三 -CMDB
查看>>
STM32的DMA
查看>>
Process Class (System.Diagnostics)
查看>>
hdu 3001
查看>>
手机端H5上滑加载下一页
查看>>
Coursera Algorithms week3 快速排序 练习测验: Nuts and bolts
查看>>
Spring框架中Bean管理的常用注解
查看>>
Core Animation系列之CADisplayLink
查看>>
dedecms标签调用大全
查看>>
《与小卡特一起学Python》Code1
查看>>
[ZJOI2007]捉迷藏 (点分树+堆*3)
查看>>
leetcode 412. Fizz Buzz
查看>>