mysql自定义function 写递归查询子节点

#存储文本信息表
CREATE TABLE WordInfoEntity(
    word_id VARCHAR(32) PRIMARY KEY NOT NULL,   # 主键ID UUID
    word_greda INT NOT NULL,               #等级: 0:正文文本  1234 等级
    word_name VARCHAR(100) NOT NULL,            #标题名                
    word_content VARCHAR(20000),             #内容:标题名+正文文本
    word_parentId VARCHAR(32) NOT NULL            #父级id (UUid)  
);

查子集合:向下递归(亲测能用)

#自定义递归函数,用于查询传入id的所有子id
DELIMITER //   # “//” 默认开头,必须以“//” 结尾  
CREATE FUNCTION `getChildLst`(rootId VARCHAR(32))   #设置function参数类型
RETURNS VARCHAR(1000) READS SQL DATA   #定义返回的数据类型
BEGIN  #开始
  DECLARE sTemp VARCHAR(1000);   #定义全局变量,查询出来的id进行拼接
  DECLARE sTempChd VARCHAR(1000); #临时变量,用于循环查询的单次接收
  SET sTemp = '$';   # 设置初始值
  
  SET sTempChd =CAST(rootId AS CHAR);  #赋值,进行查询你
  #SET sTempChd =rootId ;  #赋值,进行查询你
  
  WHILE sTempChd IS NOT NULL DO  #此处为循环 为null结束循环
    SET sTemp = CONCAT(sTemp,',',sTempChd);    #将查询的所有子节点赋值为全局
     #GROUP_CONCAT(word_id) : 将查询出来的结果用逗号连接在一起
     # FIND_IN_SET(word_parentId,sTempChd)  效果 ==  word_parentId in (1,2,3,4....)
     
     #select * from treenodes where FIND_IN_SET(id,'1,2,3,4,5'); 
    #使用find_in_set函数一次返回多条记录 
    #id 是一个表的字段 然后每条记录分别是id等于1,234,5的时候 
    #有点类似in (集合) 
    #select * from treenodes where id in (1,2,3,4,5); 
    SELECT GROUP_CONCAT(word_id) INTO sTempChd FROM WordInfoEntity WHERE FIND_IN_SET(word_parentId,sTempChd);  #将查询出来的子id, 再次将子id当作父id进行查询
  END WHILE;
  RETURN sTemp;  #将最后结果返回出去
END  //   # 结束,必须以“//” 结束
DELIMITER ;

查询语句:

#传入父级id查询所有子级信息(function递归查询)
SELECT * FROM WordInfoEntity WHERE FIND_IN_SET(word_id, getChildLst('eeee'));

 

查父集合:向上递归(未亲测,未知是否能用)

--drop FUNCTION `getParentList`  
CREATE FUNCTION `getParentList`(rootId varchar(100))   
RETURNS varchar(1000)   
BEGIN   
DECLARE fid varchar(100) default '';   
DECLARE str varchar(1000) default rootId;   
  
WHILE rootId is not null  do   
    SET fid =(SELECT parentid FROM treeNodes WHERE id = rootId);   
    IF fid is not null THEN   
        SET str = concat(str, ',', fid);   
        SET rootId = fid;   
    ELSE   
        SET rootId = fid;   
    END IF;   
END WHILE;   
return str;  
END 

查询语句:

select getParentList('001001001001001');   
  
select * from sbkfwh where FIND_IN_SET(id,getParentList('001001001001002'))  

 

posted @ 2018-10-16 09:38  陌笠人灬苼  阅读(782)  评论(0编辑  收藏  举报