关于MySQL递归查询,从子类ID查询所有父类,从父类ID查询所有子类

文章介绍了在数据库管理中,如何从子节点(如子部门ID)查询到根节点信息。提供了两种SQL查询方式,包括自连接和Oracle的ConnectBy函数,并展示了一个存储过程来查找所有子部门ID。这些方法常用于处理无限分类的问题。
摘要由CSDN通过智能技术生成

一、业务场景

业务需要根据一个子节点查询出根节点的信息。做无限分类经常用到。

1.子部门id查所有父级部门

代码如下(示例):

SELECT T2.*
   FROM (
   SELECT
   @r AS _id,
   (SELECT @r := parent_id FROM tbl_app_dept WHERE id = _id) AS parent_id, @l := @l + 1 AS lvl
   FROM
   (SELECT @r := '232', @l := 0) vars, tbl_app_dept h WHERE @r <> 0) T1
   JOIN tbl_app_dept T2 ON T1._id = T2.id
   ORDER BY T1.lvl DESC

2.oracle connect by实现

#由叶子节点查根节点
select * from table start with id=1 connect by id = prior p_id
#由父节点查叶子节点
select * from table start with p_id=4 connect by prior id = p_id

3.存储过程查看所有子部门id

CREATE DEFINER=`root`@`%` FUNCTION `test_db`.`getChildList`(rootId varchar(1000)) RETURNS mediumtext CHARSET utf8
    DETERMINISTIC
    COMMENT '查询所有子部门id'
BEGIN
    DECLARE sTemp MEDIUMTEXT;
       DECLARE sTempChd MEDIUMTEXT;

       SET sTemp = '$';
       SET sTempChd =cast(rootId as CHAR);

       WHILE sTempChd is not null DO
         SET sTemp = concat(sTemp,',',sTempChd);
         SELECT group_concat(dept_id) INTO sTempChd FROM tbl_app_dept where FIND_IN_SET(parent_id,sTempChd)>0;
       END WHILE;
       RETURN sTemp;
END
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值