Mysql根据某层部门ID查询所有下级多层子部门

模拟表和数据脚本

复制以下sql语句生成一个叫sys_dept的表和插入若干构造好的有层级关系的数据,直接复制执行就ok

DROP TABLE IF EXISTS `sys_dept`;
CREATE TABLE `sys_dept` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 部门编号,
  `p_id` int(11) DEFAULT NULL COMMENT 父级部门编号,
  `title` varchar(255) DEFAULT NULL COMMENT 父级部门名称,
  `is_open` int(11) DEFAULT NULL COMMENT 是否展开(0-展开,1-不展开),
  `address` varchar(255) DEFAULT NULL COMMENT 部门地址,
  `create_time` datetime DEFAULT NULL COMMENT 创建时间,
  `remark` varchar(255) DEFAULT NULL COMMENT 备注,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO sys_dept (p_id,title,is_open,address,create_time,remark) VALUES 
(0,总经办,1,深圳,2019-04-10 14:06:32.000,大BOSS)
,(1,销售部,0,武汉,2019-04-10 14:06:32.000,程序员屌丝)
,(1,运营部,0,武汉,2019-04-10 14:06:32.000,无)
,(1,生产部,0,武汉,2019-04-10 14:06:32.000,无)
,(2,销售一部,0,武汉,2019-04-10 14:06:32.000,销售一部)
,(2,销售二部,0,武汉,2019-04-10 14:06:32.000,销售二部)
,(2,销售三部,0,广州,2019-04-10 14:06:32.000,销售三部)
,(2,销售四部,0,广州,2019-04-10 14:06:32.000,销售四部)
,(2,销售五部,0,广州,2019-04-10 14:06:32.000,销售五部)
,(3,运营一部,0,武汉,2019-04-10 14:06:32.000,运营一部)
,(3,运营二部,0,武汉,2019-04-10 14:06:32.000,运营二部)
,(3,运营三部,0,武汉,2019-04-10 14:06:32.000,运营三部)
,(3,运营四部,0,武汉,2019-04-10 14:06:32.000,运营四部)
,(3,运营五部,0,武汉,2019-04-10 14:06:32.000,运营五部)
,(4,生产一部,1,深圳,2019-11-23 09:50:23.000,生产一部)
,(4,生产二部,1,深圳,2019-11-23 09:50:23.000,生产二部)
,(4,生产三部,1,深圳,2019-11-23 09:50:23.000,生产三部)
,(5,销售一部一组,1,深圳,2019-11-23 09:50:23.000,销售一部一组)
,(5,销售一部二组,1,深圳,2019-11-23 09:50:23.000,销售一部二组)
,(5,销售一部三组,1,深圳,2019-11-23 09:50:23.000,销售一部三组)
,(6,销售二部一组,1,深圳,2019-11-23 09:50:23.000,销售二部一组)
,(6,销售二部二组,1,深圳,2019-11-23 09:50:23.000,销售二部二组)
,(17,生产三部一组,1,深圳,2019-11-23 09:50:23.000,生产三部一组)
,(17,生产三部二组,1,深圳,2019-11-23 09:50:23.000,生产三部二组)
,(17,生产三部三组,1,深圳,2019-11-23 09:50:23.000,生产三部三组)
;

根据部门ID查询所有子部门

select
	id,title
from
	(
	select
		t1.id,t1.title,
		if(find_in_set(p_id, @pids) > 0,
		@pids := concat(@pids, ,, id),
		0) as ischild
	from
		(
		select
			id,
			p_id,
			title
		from
			ssmdemo.sys_dept t
		order by
			p_id,
			id ) t1,
		(
			select @pids := 17) t2 ) t3
where
	ischild != 0

其中@pids := 17的17就是要查询的部门ID

经验分享 程序员 微信小程序 职场和发展