MySQL向上遞歸,根據子節點查詢父節點(根節點)的函數搭配改造的SQL語句的實現


SBP_ORG_DEPT表結構如下:

 

 

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'));

查詢結果如下圖所示:

 

 注:因為父節點id為0的數據為空(數據不完善的原因),所以根節點只遞歸到1787626!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM