• 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'))  
  • 相关阅读:
    Android Studio 1.0 初体验
    JAVA笔记:死锁的详细解释
    JAVA笔记:多线程的理解及应用(三)
    JAVA笔记:多线程的理解及应用(二)
    JAVA笔记:多线程的理解及应用(一)
    mysql 中文编码
    k8s删除node
    k8s 卸载
    kubernetes 集群master变更ip地址
    docker常用指令
  • 原文地址:https://www.cnblogs.com/mh-study/p/9796140.html
Copyright © 2020-2023  润新知