MySql創建樹結構遞歸查詢存儲過程


在實現F2工作流底層多數據庫支持時發現Oracel和mssql都有提供遞歸子查詢,而MySql卻沒有,沒辦法需要自己構建存儲過程來提供這個遞歸子查詢的功能。

-- 當前節點及子節點 
-- 參數說明:idd 要查詢的資源ID值,idFieldName ID字段名,parentIdFieldName 上級ID字段名,tableName 表名,isContainMySelf 是否包含自己
DROP procedure IF EXISTS pro_getChildrenList;
create procedure pro_getChildrenList(in idd varchar(100),in idFieldName varchar(100),in parentIdFieldName varchar(100),in tableName varchar(100),isContainMySelf int)
begin
declare lev int;
set lev=1;
drop table if exists tmp1;
    CREATE TABLE tmp1(ID VARCHAR(100),ParentID varchar(100) ,levv INT);
set @strsql = CONCAT('INSERT tmp1' ,' SELECT ',idFieldName ,',' ,parentIdFieldName,',',1, ' FROM ', tableName,' WHERE ',parentIdFieldName,'=','''', idd,'''');
prepare strsql from @strsql;
execute strsql;
while  row_count()>0
do
		set lev=lev+1;
		set @strsql = CONCAT('INSERT tmp1' ,' SELECT ','t.',idFieldName,',' ,' t.',parentIdFieldName,',' ,lev, ' FROM ', tableName,' t join tmp1 a on ','t.',parentIdFieldName,'=a.ID And levv=', lev-1);
		prepare strsql from @strsql;
    execute strsql;
end while ;
   
    SET @myself='';
		IF (isContainMySelf=1) THEN 
		SET @myself = concat(' or ',idFieldName,'=','''',idd,''''); 
		ELSE 
		SET @myself = ''; 
		END IF; 

		set @strsql = CONCAT('SELECT * from ', tableName,' where ',idFieldName,' in ( SELECT ID from tmp1)',@myself);
		prepare strsql from @strsql;
    execute strsql;
end;

  


免責聲明!

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



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