通过父级找子级
表字段,从这里可以看得出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 函数名