mysql单表递归操作

it2026-06-16  4

通过父级找子级

表字段,从这里可以看得出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)