mysql递归操作

这篇博客介绍了如何在数据库中使用SQL查询构建文件夹的递归子目录,并通过函数实现递归查找所有子目录的ID。文章还展示了如何使用这些方法来执行批量删除操作,特别是利用`group_concat`和`find_in_set`函数来处理层级关系。
摘要由CSDN通过智能技术生成

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、添加部分数据

逻辑图是

具体思想

1、找到文件1的子目录

select *from t_files where parent_id = 1;

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;

 结果:

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');

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

然后将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));

删除操作:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

贪睡的蜗牛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值