1、新建表

create table `t_files` (
  id int auto_increment,
  file_name varchar(100) default '',
  file_type tinyint(4) default 0,
  parent_id int null,
  update_time timestamp null,
  primary key(id),
  unique key(file_name, parent_id) 
);

2、添加部分数据

mysql递归性能 mysql如何实现递归_mysql递归性能

逻辑图是

mysql递归性能 mysql如何实现递归_mysql递归性能_02

具体思想

1、找到文件1的子目录

select *from t_files where parent_id = 1;

mysql递归性能 mysql如何实现递归_子目录_03

2、找出子目录的子目录

这里的过程非必要情况不要使用

大体的思想,举个例子

有两个队列:队列1用于存节点的  队列2用于存树的某一层的

输入根节点,队列2存储父节点是根节点的节点(也就是第二层的所有节点),如果队列2不为空,那么将队列2的内容加入到队列1里面(1、2层已经进队列了)

然后找父节点是队列2里面的节点,也就是将第三层放入到队列2里面(队列2此前已经清空了)

如果第三层不为空,那么将队列2的内容加入到队列1里面(1、2、3进队列了) 

就这样循环进行

  具体函数:

group_concat(): 多条记录合成一条记录(加入到队列里面)

select group_concat(id) as ids from t_files where parent_id =1;

 结果:

mysql递归性能 mysql如何实现递归_字符串_04

find_in_set(str, strlist) : 在多条记录中查询特定列
str 要查询的字符串(也即父节点列名)
strlist 字段名 参数以”,”分隔 如 (1,2,6,8)

select group_concat(id) as ids from t_files where find_in_set(parent_id, '1,4');

mysql递归性能 mysql如何实现递归_父节点_05

上面意思首先查找父节点是1,4的节点

mysql递归性能 mysql如何实现递归_子目录_06

然后将id的记录合成一条记录加入到队列里面

完整步骤

代码:

DELIMITER //
CREATE FUNCTION `getChildLst`(rootId INT)

RETURNS varchar(1000) READS SQL DATA

BEGIN
  DECLARE sTemp VARCHAR(1000);
  
  DECLARE sTempChd VARCHAR(1000);

  SET sTemp = '$';

  SET sTempChd =cast(rootId as CHAR);

  WHILE sTempChd is not null DO

    SET sTemp = concat(sTemp,',',sTempChd);
    
    SELECT group_concat(id) INTO sTempChd FROM t_files where FIND_IN_SET(parent_id,sTempChd)>0;

  END WHILE;

  RETURN sTemp;

END  //
DELIMITER ;

调用:

select *from t_files where find_in_set(id, getChildLst(1));

mysql递归性能 mysql如何实现递归_子目录_07

删除操作:

delete from t_files where id in 
(select id from (select id from t_files where find_in_set(id, getChildLst(1)) ) as a);