mysql求某一个根节点所有叶子节点

需求:

通过一个user_id找到它所在的部门,再找到它所在部门的最底层部门,再到这些最底层部门的人user_id

表信息:
部门信息表


CREATE TABLE `SYS_DEPART` (
  `DEPART_ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `DEPART_NAME` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT '部门名称',
  `DESCRIPTION` varchar(256) COLLATE utf8_bin DEFAULT NULL COMMENT '部门描述',
  `PARENT_DEPART_ID` bigint(20) DEFAULT NULL COMMENT '父部门ID',
  `ORG_CODE` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '部门编号',
  PRIMARY KEY (`DEPART_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=64 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='部门表'
mysql求某一个根节点所有叶子节点_第1张图片
Paste_Image.png

用户信息表


CREATE TABLE `SYS_DEPART_USER` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `DEPART_ID` bigint(20) DEFAULT NULL COMMENT '部门ID',
  `USER_ID` bigint(20) DEFAULT NULL COMMENT '用户ID',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=48 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='部门用户表'
mysql求某一个根节点所有叶子节点_第2张图片
Paste_Image.png

部门信息表初始化数据

insert into sys_depart values(1,'first','first',0,'123'),(2,'second','second',1,'123'),
    (3,'third','third',1,'123'),(4,'forth','forth',2,'123'),(5,'fifth','fifth',2,'123'),
    (6,'sixth','sixth',3,'123'),(7,'seventh','seventh',3,'123');

用户信息表初始化数据

insert into sys_depart_user values(1,2,114),(2,2,115),(3,2,116),(4,3,118),(5,6,119);

    insert into sys_depart_user values(6,4,120),(7,5,111),(8,5,555),(9,4,188),(10,6,1369);


创建临时表作为辅助,注意,我这个临时表是普通表,mysql也有临时表的概念是基于session的,如果需要单个session查询完成以后立即返回结果,可以把结果写入到mysql临时表,最后通过查询临时表的信息放到游标中,然后返回数据,session一旦完成,临时表会自动清空
我这里为了直观的显示数据,直接把结果存储在表中(后期可以把这个表换成临时表返回游标作为全部信息)

create table user_temp_table
    (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `DEPART_ID` bigint(20) DEFAULT NULL COMMENT '部门ID',
  `USER_ID` bigint(20) DEFAULT NULL COMMENT '用户ID',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=48 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='部门用户表';


具体实现存储过程如下:

delimiter //

CREATE PROCEDURE getUserInfo(userId int)
BEGIN
  DECLARE rootId  varchar(100);
  DECLARE tempChd varchar(1024);
  DECLARE temp varchar(1024);
  SELECT DEPART_ID INTO rootId  FROM sys_depart_user WHERE USER_ID=userId;
  SET tempChd = rootId;
  WHILE tempChd is not null DO
   SET temp = tempChd;
   SELECT group_concat(depart_id) INTO tempChd FROM sys_depart WHERE FIND_IN_SET(parent_depart_id,tempChd) >0;
   INSERT INTO user_temp_table SELECT * FROM sys_depart_user WHERE depart_id in (SELECT depart_id  FROM sys_depart WHERE FIND_IN_SET(parent_depart_id,temp) >0);
  END WHILE;
 END
//

delimiter ;

假如:我需要查找用户为114的部门的子部门的所有的用户信息,如下执行结果

mysql求某一个根节点所有叶子节点_第3张图片
Paste_Image.png

group_contact函数
find_in_set函数
查询所有子节点几种方式

你可能感兴趣的:(mysql求某一个根节点所有叶子节点)