mysql tree 递归 向上_MySQL向上递归,根据子节点查询父节点(根节点)的函数搭配改造的SQL语句的实现...

本文介绍了如何在MySQL中通过自定义函数`getParentNodesFromChildNode`实现从子节点向上递归获取所有父节点的路径。针对SBP_ORG_DEPT表,原SQL语句使用START WITH...CONNECT BY无法处理,故改造为利用函数配合FIND_IN_SET方法,有效解决了大数据量场景下的递归查询问题。
摘要由CSDN通过智能技术生成

SBP_ORG_DEPT表结构如下:

2fcaede6e33878c71fb5ff3752c8fff6.png

MySQL

用函数 也可解决这种需求问题。

group_concat 不适用数据较多的时候。

函数getParentNodesFromChildNode如下所示(在MySQL数据库中新建函数):

CREATE FUNCTION `getParentNodesFromChildNode`(rootId varchar(1024),sbp_org_dept varchar(256)) RETURNS varchar(1024) CHARSET utf8

BEGIN

DECLARE nParentList VARCHAR(10000);

DECLARE nParentTemp VARCHAR(10000);

SET nParentTemp = rootId;

WHILE nParentTemp IS NOT NULL DO

IF (nParentList IS NOT NULL) THEN

SET nParentList = CONCAT(nParentTemp,',',nParentList);

ELSE

SET nParentList = CONCAT(nParentTemp);

END IF;

SELECT GROUP_CONCAT(parent_id) INTO nParentTemp FROM sbp_org_dept WHERE FIND_IN_SET(id,nParentTemp)>0;

END WHILE;

RETURN nParentList;

END

注:sbp_org_dept 是MySQL库中真实存在的表,parent_id和id是sbp_org_dept 表中真实存在的列!

-- 后台调用:

(改造前的SQL语句):SELECT * from SBP_ORG_DEPT d start with id = #{deptId} connect by d.id = prior d.parent_id;

(改造后的SQL语句):SELECT *  from  SBP_ORG_DEPT where FIND_IN_SET( id , getParentNodesFromChildNode( #{deptId} , 'SBP_ORG_DEPT') );

注:#{deptId},是后台映射传参进来的参数,参数名一定要一致!!!

eg: select * from SBP_ORG_DEPT where FIND_IN_SET(id,getParentNodesFromChildNode('1788051', 'SBP_ORG_DEPT'));

查询结果如下图所示:

e9fe4f044a42d040ab8ac80e768b8608.png

注:因为父节点id为0的数据为空(数据不完善的原因),所以根节点只递归到1787626!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值