需求:
通过一个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='部门表'
用户信息表
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='部门用户表'
部门信息表初始化数据
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的部门的子部门的所有的用户信息,如下执行结果
group_contact函数
find_in_set函数
查询所有子节点几种方式