Mysql查询树形结构数据

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值