MYSQL无限子集递归查询函数

本文介绍如何在MySQL中通过自定义函数实现上下级查询,由于MySQL不内置支持递归查询,故需要编写getChildLst函数,该函数根据输入的根记录ID和查询方向,递归获取所有下级或上级ID。示例代码展示了如何利用FIND_IN_SET和GROUP_CONCAT实现这一功能。

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

在业务中经常会遇到,需要查询下级菜单、下级部门、上级领导等等相关上下级查询到需求,实现此类的需求,需要使用到递归查询,但是mysql中又未提供支持,因而需要自行实现相关功能。本文提供的内容仅供参考学习,请勿用于其他用途。

mysql里没有递归查询的函数,需要自己去创建,Oracle中已经包含,直接使用即可。

mysql自定义子集递归查询函数getChildLst,可以查询所有下级或者上级的ID,可以依据ID的集合,进行下一步操作,获取其他的相关信息。

入参:根记录ID rootId,

            查询类型  direction,1:查询所有下级;2:查询所有上级

出参:符合条件的记录ID

根据自己的需要,进行修改。

createUserId 和 id 均为用户ID。

利用FIND_IN_SET函数,要求前一个字符串 一定要在后一个字符串集合中才返回大于0的数;

当满足条件时,则把结果级添加返回数据中,直到全部不满足条件,则表示所有的上级或者下级都已经查询出,可以返回数据

具体的实现示例代码如下所示,如需使用,请根据自己的需要,修改表名以及相关字段名称。

CREATE FUNCTION `getChildLst`(rootId int,direction int) RETURNS varchar(1000) CHARSET utf8mb4
BEGIN
     DECLARE sTemp VARCHAR(5000); 
     DECLARE sTempChd VARCHAR(1000); 
     SET sTemp = '$';  -- 初始化
     SET sTempChd =cast(rootId as CHAR); 
    
   IF direction=1 THEN  -- 查询下级ID
    WHILE sTempChd is not null DO   
        SET sTemp = concat(sTemp,',',sTempChd);  
        SELECT group_concat(id) INTO sTempChd FROM web_user where FIND_IN_SET(createUserId,sTempChd)>0;
    END WHILE;
   ELSEIF direction=2 THEN -- 查询上级ID集合
    WHILE sTempChd is not null DO
        SET sTemp = concat(sTemp,',',sTempChd);
        SELECT group_concat(createUserId) INTO sTempChd FROM web_user where  FIND_IN_SET(Id,sTempChd)>0;
    END WHILE;
   END IF;
 
RETURN sTemp;
END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值