在业务中经常会遇到,需要查询下级菜单、下级部门、上级领导等等相关上下级查询到需求,实现此类的需求,需要使用到递归查询,但是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