博客
关于我
mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现
阅读量:794 次
发布时间:2023-02-11

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

在处理树状数据时,MySQL由于版本限制,难以直接支持循环递归查询,这与SQLServer和Oracle等数据库相比存在一定差异。因此,本程序通过编写两个SQL存储程序来实现子节点和父节点的查询功能,其中子节点查询模拟了其他数据库的实现方式,而父节点查询则采用了逆向思维的方法来解决问题。

具体来说,主要关注的表是`user_role`,其主键为`id`,每条记录都有一个`parentid`字段用于标识对应记录的父节点。父节点可以有多个子节点,这就形成了一个典型的树状结构。

**存储程序一:`getChildList`函数**

该函数用于获取指定根节点的所有子节点ID并返回为字符串。具体实现逻辑如下:

1. 初始化变量`rootId`为传入的参数值,并将其转换为字符类型。

2. 使用循环迭代,直到`rootId`为`NULL`。

3. 在循环中,首先检查是否已经收集到子节点ID。如果已收集,则将当前节点ID追加到结果字符串末尾;否则,则直接将当前节点ID设为结果字符串。

4. 每次循环后,更新`rootId`为当前节点的子节点之一,具体取值通过查询`user_role`表中满足`FIND_IN_SET(parentid, sChildTemp)`条件的记录来确定。

5. 当循环结束后,返回最终收集到的子节点ID字符串。

**存储程序二:`getParentList`函数**

该函数用于获取指定根节点的所有父节点ID并返回为字符串。实现逻辑与`getChildList`类似,但方向相反:

1. 初始化变量`rootId`为传入的参数值,并将其转换为字符类型。

2. 使用循环迭代,直到`rootId`为`NULL`。

3. 在循环中,首先检查是否已经收集到父节点ID。如果已收集,则将当前节点ID追加到结果字符串末尾;否则,则直接将当前节点ID设为结果字符串。

4. 每次循环后,更新`rootId`为当前节点的父节点之一,具体取值通过查询`user_role`表中满足`FIND_IN_SET(id, sParentTemp)`条件的记录来确定。

5. 当循环结束后,返回最终收集到的父节点ID字符串。

**实际应用示例**

可以通过以下方式调用存储程序:

1. 调用`getChildList`函数时,传入根节点ID(例如`0`),然后从`user_role`表中筛选出`FIND_IN_SET(id, getChildList(2))`的记录。

2. 调用`getParentList`函数时,传入叶节点ID(例如`6`),然后从`user_role`表中筛选出`FIND_IN_SET(id, getParentList(2))`的记录。

通过以上方法,可以在MySQL中实现对树状数据的层层遍历,虽然无法直接支持循环递归查询,但通过存储程序的模拟实现,仍能满足实际业务需求。

转载地址:http://ndbfk.baihongyu.com/

你可能感兴趣的文章
mysql中having的用法
查看>>
MySQL中interactive_timeout和wait_timeout的区别
查看>>
mysql中int、bigint、smallint 和 tinyint的区别、char和varchar的区别详细介绍
查看>>
mysql中json_extract的使用方法
查看>>
mysql中json_extract的使用方法
查看>>
mysql中kill掉所有锁表的进程
查看>>
mysql中like % %模糊查询
查看>>
MySql中mvcc学习记录
查看>>
mysql中null和空字符串的区别与问题!
查看>>
MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
查看>>
MYSQL中TINYINT的取值范围
查看>>
MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
查看>>
Mysql中varchar类型数字排序不对踩坑记录
查看>>
MySQL中一条SQL语句到底是如何执行的呢?
查看>>
MySQL中你必须知道的10件事,1.5万字!
查看>>
MySQL中使用IN()查询到底走不走索引?
查看>>
Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
查看>>
MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
查看>>
mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
查看>>
mysql中出现Unit mysql.service could not be found 的解决方法
查看>>