表结构和表数据就不公示了,查询的表user_role,主键是id,每条记录有parentid字段;

如下mysql查询函数即可实现根据一个节点查询所有的子节点,根据一个子节点查询所有的父节点。对于数据量较大的时候(我这里测试的1万条左右)。查询效率非常慢。建议在java代码中进行处理。

CREATE FUNCTION `getChildList`(rootId INT) 
    RETURNS varchar(1000) 
    BEGIN 
      DECLARE sChildList VARCHAR(1000); 
      DECLARE sChildTemp VARCHAR(1000); 
      SET sChildTemp =cast(rootId as CHAR); 
      WHILE sChildTemp is not null DO 
        IF (sChildList is not null) THEN 
          SET sChildList = concat(sChildList,',',sChildTemp); 
    ELSE 
      SET 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) BEGIN DECLARE sParentList varchar(1000); DECLARE sParentTemp varchar(1000); SET sParentTemp =cast(rootId as CHAR); WHILE sParentTemp is not null DO IF (sParentList is not null) THEN SET sParentList = concat(sParentTemp,',',sParentList); ELSE SET 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));

*/

评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

hibernate 之 HQL语句总结【转】