表结构如下:
CREATE TABLE `t_department` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
`name` varchar(45) DEFAULT NULL,
`defrole_id` int(11) DEFAULT NULL,
`company_id` int(11) DEFAULT NULL,
`remark` varchar(100) DEFAULT NULL,
`createtime` datetime DEFAULT NULL,
`modifytime` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
)
现在需要实现选出某个部门下面的所有子部门,在Oracle当中可以通过递归调用connect prior来做,但是
Mysql没有递归查询,我选择自己做一个Function来解决。
DELIMITER //
CREATE FUNCTION `getChildLst`(rootId INT)
RETURNS varchar(1000)
BEGIN
DECLARE sTemp VARCHAR(1000);
DECLARE sTempChd VARCHAR(1000);
SET sTemp = '$';
SET sTempChd =cast(rootId as CHAR);
WHILE sTempChd is not null DO
SET sTemp = concat(sTemp,',',sTempChd);
SELECT group_concat(id) INTO sTempChd FROM t_department where FIND_IN_SET(parent_id,sTempChd)>0;
END WHILE;
RETURN sTemp;
END//
DELIMITER ;
然后通过下面的SQL语句就可以选出对应部门的所有子部门。
select * from t_department
where FIND_IN_SET(id, getChildLst(1));