zoukankan      html  css  js  c++  java
  • mysql 层级结构查询

    描述:最近遇到了一个问题,在mysql中如何完成节点下的所有节点或节点上的所有父节点的查询? 在Oracle中我们知道有一个Hierarchical Queries可以通过CONNECT BY来查询,但是,在MySQL中还没有对应的函数!!! 下面给出一个function来完成的方法 下面是sql脚本,想要运行的直接赋值粘贴进数据库即可。

    好记性不如烂笔头
    下面给出一个function来完成的方法

    下面是sql脚本,想要运行的直接赋值粘贴进数据库即可。

    创建表treenodes(可以根据需要进行更改)


    – Table structure for treenodes


    DROP TABLE IF EXISTS treenodes;
    CREATE TABLE treenodes (
    id int(11) NOT NULL,
    nodename varchar(20) DEFAULT NULL,
    pid int(11) DEFAULT NULL,
    PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;


    – Table structure for treenodes


    插入几条数据


    – Records of treenodes


    INSERT INTO treenodes VALUES (‘1’, ‘A’, ‘0’);
    INSERT INTO treenodes VALUES (‘2’, ‘B’, ‘1’);
    INSERT INTO treenodes VALUES (‘3’, ‘C’, ‘1’);
    INSERT INTO treenodes VALUES (‘4’, ‘D’, ‘2’);
    INSERT INTO treenodes VALUES (‘5’, ‘E’, ‘2’);
    INSERT INTO treenodes VALUES (‘6’, ‘F’, ‘3’);
    INSERT INTO treenodes VALUES (‘7’, ‘G’, ‘6’);
    INSERT INTO treenodes VALUES (‘8’, ‘H’, ‘0’);
    INSERT INTO treenodes VALUES (‘9’, ‘I’, ‘8’);
    INSERT INTO treenodes VALUES (‘10’, ‘J’, ‘8’);
    INSERT INTO treenodes VALUES (‘11’, ‘K’, ‘8’);
    INSERT INTO treenodes VALUES (‘12’, ‘L’, ‘9’);
    INSERT INTO treenodes VALUES (‘13’, ‘M’, ‘9’);
    INSERT INTO treenodes VALUES (‘14’, ‘N’, ‘12’);
    INSERT INTO treenodes VALUES (‘15’, ‘O’, ‘12’);
    INSERT INTO treenodes VALUES (‘16’, ‘P’, ‘15’);
    INSERT INTO treenodes VALUES (‘17’, ‘Q’, ‘15’); 


    把下面的语句直接粘贴进命令行执行即可(注意修改传入的参数,默认rootId,表明默认treenodes)

    根据传入id查询所有父节点的id

    delimiter // 
    CREATE FUNCTION `getParList`(rootId INT)
    RETURNS varchar(1000) 
    BEGIN
        DECLARE sTemp VARCHAR(1000);
        DECLARE sTempPar VARCHAR(1000); 
        SET sTemp = ''; 
        SET sTempPar =rootId; 
    
        #循环递归
        WHILE sTempPar is not null DO 
            #判断是否是第一个,不加的话第一个会为空
            IF sTemp != '' THEN
                SET sTemp = concat(sTemp,',',sTempPar);
            ELSE
                SET sTemp = sTempPar;
            END IF;
            SET sTemp = concat(sTemp,',',sTempPar); 
            SELECT group_concat(pid) INTO sTempPar FROM treenodes where pid<>id and FIND_IN_SET(id,sTempPar)>0; 
        END WHILE; 
    
    RETURN sTemp; 
    END
    //
     

    执行命令

    select * from treenodes where FIND_IN_SET(id,getParList(15));
    结果:

     
    根据传入id查询所有子节点的id

    delimiter // 
    CREATE FUNCTION `getChildList`(rootId INT)
    RETURNS varchar(1000) 
    
    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  treeNodes where FIND_IN_SET(pid,sTempChd)>0;
        END WHILE;
        RETURN sTemp; 
    END
    //

    执行命令

    select * from treenodes where FIND_IN_SET(id,getChildList(7));
    结果:

  • 相关阅读:
    用HTML5的Audio标签做一个歌词同步的效果
    关于AJAX的跨域问题
    java 计算器后台实现
    springboot 学习(一) 配置mybatis ,全局日期处理
    Java不可见字符处理
    eclipse 常用插件
    Spring data jpa 返回map 结果集
    Oracle数据中表值插不进去问题(转)
    利用Eclipse的JPA自动生成注解实体
    对象-Map 相互转换
  • 原文地址:https://www.cnblogs.com/wenBlog/p/10862183.html
Copyright © 2011-2022 走看看