mysql单表递归操作

通过父级找子级

表字段,从这里可以看得出parent_id是上一级的id,而这是在同一个表的。

找出所有的下级(找出的结果包括自己本身,就是会把本身的查出来,在往下找子级)

(1)编写找下级的方法(只需要执行一次)

create function 方法名(orgid INT)
returns varchar(4000)
BEGIN
DECLARE oTemp VARCHAR(4000);
DECLARE oTempChild VARCHAR(4000);
 
SET oTemp = '';
SET oTempChild = CAST(orgid AS CHAR);
 
WHILE oTempChild IS NOT NULL
DO
SET oTemp = CONCAT(oTemp,',',oTempChild);
SELECT GROUP_CONCAT(子字段) INTO oTempChild FROM 表名 WHERE FIND_IN_SET(父字段,oTempChild) > 0;
END WHILE;
RETURN oTemp;
END

(2)执行sql调用使用方法

。。。。。 where FIND_IN_SET(当前表中的唯一标识标记,方法名(当前表中代表上级的唯一标识))

(3)删除自定义方法

用完记得把自定义方法删除掉,不然会一直存在占用内存

drop function 函数名称

(4)就当前表编写的案例

总的操作语句

查出来的内容

添加和删除的就不展示了

通过子级找父级

这个可以使用上面的那种写方法的方式,也可以不写方法去实现,

SELECT *
    FROM ( 
        SELECT 
                @r AS _id, 
                (SELECT @r := 父级字段 FROM 表名 WHERE 子级字段 = _id) AS parent_id, 
                 @l := @l + 1 AS lvl 
        FROM 
                (SELECT @r := 子级字段, @l := 0) vars, 
                表名 h 
        WHERE @r <> 0) T1 
    JOIN 表名 T2 
    ON T1._id = T2.id
ORDER BY 排序字段 DESC;

案例

如果存在该函数就删除,就删除这个函数

DROP FUNCTION IF EXISTS 函数名

参考大佬的文档:https://blog.csdn.net/weixin_35756522/article/details/81876534?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduend~default-4-81876534.nonecase&utm_term=mysql%20%E9%80%92%E5%BD%92%E5%87%BD%E6%95%B0%E8%AF%A6%E8%A7%A3&spm=1000.2123.3001.4430

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值