递归查询(简单粗暴),新手必备

1.首先需要建一张表(不做过多介绍)

   唯一要求,表中有 父子关系的ID 就可以

2 ,创建两个函数--------注意是两个(复制到你的sql工具里面直接运行一下即可) 

-------------------------上代码------------------------------

-----------------------------------------------------------一级查询(只查下一级)------------------------------------

CREATE DEFINER=`root`@`localhost` FUNCTION `getTaskNodes`(param_i_id int) RETURNS varchar(100) CHARSET utf8mb4
READS SQL DATA
BEGIN
DECLARE strSubIds VARCHAR(100);

DECLARE strPid VARCHAR(100);

SET strSubIds = '$';

SET strPid =cast(param_i_id as CHAR);

SELECT GROUP_CONCAT(“子ID”) INTO strSubIds FROM 表名  WHERE 父ID=strPid;

RETURN strSubIds;

END

注:以上的子ID  父ID 均填写自己表中的 ID字段  例如: c_id ,  p_id

 

----------------------------------多级查询,一直到底-----------------------------------

CREATE DEFINER=`root`@`localhost` FUNCTION `getAllTaskNodes`(`param_i_id` int) RETURNS varchar(100) CHARSET utf8mb4
READS SQL DATA
BEGIN

DECLARE strAllSubIds VARCHAR(100);
DECLARE strTempPid VARCHAR(100);

#先得到第一级,也可以掉用getSubNodes(param_i_id);

# SELECT GROUP_CONCAT(子ID) INTO strAllSubIds FROM  表名 WHERE 父ID=param_i_id;

SET strAllSubIds = getTaskNodes(param_i_id);

SET strTempPid = strAllSubIds;

#根据 strTempPid 判断是否还有子节点

WHILE strTempPid is not null DO

SELECT group_concat(dept_id) INTO strTempPid FROM employee_task WHERE FIND_IN_SET(parent_id,strTempPid)>0;

#需要对strTempPid判断,非空用 , 连接

IF (strTempPid is not NULL) THEN

SET strAllSubIds = concat(strAllSubIds,',',strTempPid);

END IF;
END WHILE;
RETURN strAllSubIds;
END

 

-----------------------------------------------------以上为两个函数------------------------------------------------

 

最后需要调用的查询sql 语句

select *  from   表名   where    find_in_set(子ID字段, getAllTaskNodes(#{子ID的值}))

-----------------------------好了,一个递归查询就是这么简单---------------------------------------

注意:对于新手,直接复制粘贴即可,把其中的汉字,改成你自己的 字段以及 表名就行!!!

 

posted @ 2020-12-27 02:46  御赐  阅读(952)  评论(0编辑  收藏  举报