Mysql处理树形数据
一、简介
在实际开发中,会遇到类似部门一样的树形数据的处理,即部门嵌套。主要是两个方面,获取某个部门的绝对路径(普元信息/企业交付部/研发部/张三),以及获取到某个部门下所有的子部门信息(获取到的子部门id用,号拼接显示)。
二、数据处理
1、树型数据处理所用到的几个函数
- GROUP_CONCAT函数:列转行函数,将查询出来的多个列的内容拼接成一行,并以,号分割。
- FIND_IN_SET函数:FIND_IN_SET(str1,str2),该函数用于判断str1是否存在于str2中,如果存在返回真,否则返回假。str中的多个字符串用,号分隔
2、获取部门的绝对路径
给出指定的部门id,获取其父部门及祖先部门等,最后以/分割,例子如下:
亚信科技/研发部/研发一组/李四。如果要在其他语言中,做到这样并不难,一个循环,加字符串拼接,最后返回字符串就行了。但在mysql中(个人不是太熟悉mysql函数)还是觉得麻烦很多,附函数代码如下:
BEGIN
DECLARE sParentList VARCHAR(1000);
DECLARE sParentTemp VARCHAR(1000);
DECLARE sNameTemp VARCHAR(1000);
DECLARE sIdTemp VARCHAR(1000);
SET sParentTemp = CAST(rootId AS CHAR);
WHILE sParentTemp IS NOT NULL DO
IF (sParentList IS NOT NULL) THEN
SET sParentList = CONCAT(sNameTemp,'/',sParentList);
ELSE
SET sParentList = CONCAT(sNameTemp);
END IF;
SET sIdTemp = sParentTemp;
SELECT GROUP_CONCAT(parentId) INTO sParentTemp FROM uump_organization WHERE FIND_IN_SET(ID,sParentTemp)>0;
SELECT GROUP_CONCAT(name) INTO sNameTemp FROM uump_organization WHERE FIND_IN_SET(ID,sIdTemp)>0;
END WHILE;
RETURN sParentList;
END
也是借助mysql函数,使用循环的方法,根据id以及parentid,将其name查出,最后拼接在sParentList中然后返回。代码需要理解下,在这里不做过多的描述。
3、获取某个部门所有的子部门id
给定部门id,获取其所有的子部门id,并以,号拼接。因为某个部门下的子部门很可能会有很多,还好mysql有自带的group_concat函数,否则处理起来会麻烦很多。附代码如下:
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 uump_organization WHERE FIND_IN_SET(PARENTID,sTempChd)>0;
END WHILE;
RETURN sTemp;
END
*注:限于编者水平,文中错误纰漏之处,欢迎大家批评指正