表结构和表数据就不公示了,查询的表user_role,主键是id,每条记录有parentid字段;
如下mysql查询函数即可实现根据一个节点查询所有的子节点,根据一个子节点查询所有的父节点。对于数据量较大的时候(我这里测试的1万条左右)。查询效率非常慢。建议在java代码中进行处理。
CREATE FUNCTION `getChildList`(rootId INT)RETURNS varchar(1000)BEGINDECLARE sChildList VARCHAR(1000);DECLARE sChildTemp VARCHAR(1000);SET sChildTemp =cast(rootId as CHAR);WHILE sChildTemp is not null DOIF (sChildList is not null) THENSET sChildList = concat(sChildList,',',sChildTemp);ELSESET sChildList = concat(sChildTemp);END IF;SELECT group_concat(id) INTO sChildTemp FROM user_role where FIND_IN_SET(parentid,sChildTemp)>0;END WHILE;RETURN sChildList;END;
/*获取子节点*/
/*调用: 1、select getChildList(0) id;
2、select * 5From user_role where FIND_IN_SET(id, getChildList(2));
*/CREATE FUNCTION `getParentList`(rootId INT)RETURNS varchar(1000)BEGINDECLARE sParentList varchar(1000);DECLARE sParentTemp varchar(1000);SET sParentTemp =cast(rootId as CHAR);WHILE sParentTemp is not null DOIF (sParentList is not null) THENSET sParentList = concat(sParentTemp,',',sParentList);ELSESET sParentList = concat(sParentTemp);END IF;SELECT group_concat(parentid) INTO sParentTemp FROM user_role where FIND_IN_SET(id,sParentTemp)>0;END WHILE;RETURN sParentList;END;
/*获取父节点*/
/*调用: 1、select getParentList(6) id;
2、select * From user_role where FIND_IN_SET(id, getParentList(2));*/
|