MySQL(菜单、部门等信息)递归查询

本文介绍两种MySQL中的递归查询方法:一是使用存储过程结合find_in_set()和group_concat()函数实现,二是利用MySQL 8.0新增的WITH RECURSIVE语法进行递归查询。这两种方法分别适用于向下查询和向上查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法一:(普通函数形式)

说明: 利用find_in_set()函数和group_concat()函数实现递归查询

一:向下查询:

DROPFUNCTION IF EXISTS testHS;
DELIMITER ;;
CREATE FUNCTION testHS(testId INT)
RETURNS VARCHAR(4000)
BEGIN
DECLARE sTemp VARCHAR(4000);
DECLARE sTempChd VARCHAR(4000);

SET sTemp='$';
SET sTempChd = CAST(testId AS CHAR);

WHILE sTempChd IS NOT NULL DO
SET sTemp= CONCAT(sTemp,',',sTempChd);
SELECT GROUP_CONCAT(id) INTO sTempChd FROM testInfo WHERE FIND_IN_SET(parentId,sTempChd)>0;
END WHILE;
RETURN sTemp;
END;;
DELIMITER ;

二:向上查询

DROP FUNCTION IF EXISTS testHS;
DELIMITER;;
CREATE FUNCTION testHS(testId VARCHAR(20))
RETURNS VARCHAR(4000)
BEGIN
DECLARE sTemp VARCHAR(4000);
DECLARE sTempChd VARCHAR(4000);

SET sTemp='$';
SET sTempChd = CAST(testId AS CHAR);
SET sTemp = CONCAT(sTemp,',',sTempChd);

SELECT parentId INTO sTempChd FROM testInfo WHERE id = sTempChd;
WHILE sTempChd <> 0 DO
SET sTemp = CONCAT(sTemp,',',sTempChd);
SELECT parentId INTO sTempChd FROM testInfo WHERE id = sTempChd;
END WHILE;
RETURN sTemp;
END;;
DELIMITER ;

方法二:(MySql 8 WITH RECURSIVE 函数)

原数据
在这里插入图片描述

一: 向下查询

在这里插入图片描述

with recursive temp as(
    select * from user_test where id = 1
    union all
    select u.* from user_test u,temp t where t.id = u.pri
)
select * from temp;

二:向上查询
在这里插入图片描述

with recursive temp as(
    select * from user_test where id = 5
    union all
    select u.* from user_test u,temp t where t.pri = u.id
)
select * from temp;
### MySQL查询层级菜单树结构 在处理层级菜单树结构时,数据库设计通常采用自关联的方式。这意味着表中会有一个外键指向自身的主键,从而形成父子关系。 对于子节点与父节点具有相同属性的情况,在 `MySQL` 数据库中可以通过递归公共表达式(Common Table Expressions, CTEs)来实现高效的层级查询[^2]。需要注意的是,CTEs 是从 MySQL 8.0 版本开始支持的功能。下面提供了一个具体的例子: 假设存在一张名为 `departments` 的表格,其定义如下: | Column Name | Data Type | |-------------|-----------| | id | INT | | name | VARCHAR | | parentId | INT | 这里 `parentId` 字段用来表示当前记录所属的上级部门 ID;如果为 NULL,则表明这是一个顶级部门。 为了获取完整的树状结构数据,可以编写如下的 SQL 查询语句: ```sql WITH RECURSIVE tree AS ( SELECT d.id, d.name, d.parentId, CAST(d.id AS CHAR(100)) as path -- 初始化路径字符串 FROM departments d WHERE parentId IS NULL UNION ALL SELECT c.id, CONCAT(REPEAT(' ', COUNT(parent.id)), c.name), -- 添加缩进来显示层次感 c.parentId, CONCAT(t.path, ',', CAST(c.id AS CHAR)) FROM departments c INNER JOIN tree t ON c.parentId = t.id ) SELECT * FROM tree ORDER BY path; ``` 这段代码首先选择了所有的根节点作为起始点,接着利用递归部分不断向下遍历每一层直到没有更多的下级节点为止。最终结果按照构建好的路径顺序排列,使得整个树形结构清晰可见。 此外,在实际应用开发过程中,还可以考虑将上述逻辑封装到存储过程或视图当中以便于调用和维护。当涉及到前后端交互时,建议参照特定框架的要求调整返回的数据格式,比如 JSON 数组等形式[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

g攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值