其他分享
首页 > 其他分享> > 根据用户id查询树结构组织的存储过程(当前节点及点钱节点以下数据)

根据用户id查询树结构组织的存储过程(当前节点及点钱节点以下数据)

作者:互联网

1.表结构:  用户信息表    组织信息表  用户信息月组织信息关联表  ==  一个用户可能有多个节点,一个节点可能有多个子节点

2.思路:创建中间表将查到的数据存储到中间表(循环调用递归查下级组织)

 

DELIMITER //
drop procedure if exists findAllChild //
CREATE PROCEDURE findAllChild(layer bigint,userId bigint)
/* layer 允许递归深度 , userId cscp_user_org 的user_id */
BEGIN
DECLARE s int DEFAULT 0; /*循环终止条件*/
declare orgId bigint;/*父级组织id*/
declare orgName varchar(50) character set utf8;
/* 游标定义 */
declare report CURSOR FOR select co.id,co.org_name from app_admin.cscp_user_org uo,app_admin.cscp_org co where uo.org_id =co.id and uo.user_id = userId ;/*orgid集合*/
DECLARE CONTINUE HANDLER FOR NOT FOUND SET s= -1; /*当遍历到最后一条时把s赋值-1*/

/*创建接受查询的临时表 */
create temporary table if not exists tmp_table(id bigint,name varchar(50)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

open report; /**放开游标**/

fetch report into orgId,orgName; /*将集合的值赋值到变量*/

insert into tmp_table values(orgId,orgName);

while s <> -1 do /*当s!=-1时执行*/

/* 核心数据收集 */
call findLChild(orgId,layer);

fetch report into orgId,orgName; /*设置下一个变量值*/

end while; /*结束循环*/
close report; /*关闭游标*/

select DISTINCT(id),name from tmp_table ;/* 如果一个用户在该节点及子节点都有会有重复数据 去重展现 */
drop temporary table if exists tmp_table ;/*删除临时表*/
END;//


drop procedure if exists findLChild//
/* iid 递归父节点 , layer 允许递归深度 */

CREATE PROCEDURE findLChild(iid bigint,layer bigint)
BEGIN

/*最高允许递归数*/
SET @@max_sp_recursion_depth = 99 ;
call iterative(iid,layer);/*核心数据收集*/


END;//

drop procedure if exists iterative //
CREATE PROCEDURE iterative(iid bigint,layer bigint)
BEGIN
declare tid bigint default -1 ;
declare tname varchar(50) character set utf8;

/* 游标定义 */
declare cur1 CURSOR FOR select id,org_name from app_admin.cscp_org where parent_id=iid ;
declare CONTINUE HANDLER FOR SQLSTATE '02000' SET tid = null;

/* 允许递归深度 */
if layer>0 then
OPEN cur1 ;
FETCH cur1 INTO tid,tname ;
WHILE ( tid is not null )
DO
/* 核心数据收集 */
insert into tmp_table values(tid,tname);
call iterative(tid,layer-1);
FETCH cur1 INTO tid,tname ;
END WHILE;
end if;
END;//
DELIMITER ;

标签:layer,及点,树结构,节点,bigint,table,declare,org,id
来源: https://www.cnblogs.com/xxmmllcc/p/16207251.html