ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-04-29 17:01:35  阅读:196  来源: 互联网

标签:layer 及点 树结构 节点 bigint table declare org 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有