zoukankan      html  css  js  c++  java
  • MySql/Oracle树形结构查询

    Oracle树形结构递归查询

    在Oracle中,对于树形查询可以使用start with ... connect by 

    select * from treeTable start with id='1' connect by id = prior parent_id;

    若将一个树状结构存储在一张表里,需要在表中存入两个字段ID和PARENTID,表示每一条记录的parent是谁。

    table: treeTable

    1.从根节点遍历子节点.:(一整棵树)

    select * from treeTable start with id=1 connect by prior id=parentid (prior 表示上一条记录)

    2.从一个叶子追溯到根节点:(树的一枝)

    select * from treeTable start with id=3 connect by prior parentid=id (prior 表示上一条记录)

    3.可通过level 关键字查询所在层次.

    select *,level from treeTable start with id=1 connect by prior id=parentid (prior 表示上一条记录)

    MySql树形结构递归查询

     mysq虽没有自带的语法支持,不过可以通过创建函数来实现递归查询。

    如下图所示。。。

    直接上sql语句

    复制代码
    create table `nodelist` (
        `id` int (11),
        `nodecontent` varchar (300),
        `pid` int (11)
    ); 
    insert into `nodelist` (`id`, `nodecontent`, `pid`) values('1','a',NULL);
    insert into `nodelist` (`id`, `nodecontent`, `pid`) values('2','b','1');
    insert into `nodelist` (`id`, `nodecontent`, `pid`) values('3','c','1');
    insert into `nodelist` (`id`, `nodecontent`, `pid`) values('4','d','2');
    insert into `nodelist` (`id`, `nodecontent`, `pid`) values('5','e','3');
    insert into `nodelist` (`id`, `nodecontent`, `pid`) values('6','f','3');
    insert into `nodelist` (`id`, `nodecontent`, `pid`) values('7','g','5');
    insert into `nodelist` (`id`, `nodecontent`, `pid`) values('8','h','7');
    insert into `nodelist` (`id`, `nodecontent`, `pid`) values('9','i','8');
    insert into `nodelist` (`id`, `nodecontent`, `pid`) values('10','j','8');
    复制代码

     之后创建一个函数

    复制代码
    DROP FUNCTION IF EXISTS `getChild`$$
    CREATE DEFINER=`root`@`localhost` FUNCTION `getChild`(rootId INT) RETURNS VARCHAR(1000) CHARSET utf8
    BEGIN
            DECLARE ptemp VARCHAR(1000);
            DECLARE ctemp VARCHAR(1000);
                   SET ptemp = '#';
                   SET ctemp =CAST(rootId AS CHAR);
                   WHILE ctemp IS NOT NULL DO
                     SET ptemp = CONCAT(ptemp,',',ctemp);
                    SELECT GROUP_CONCAT(id) INTO ctemp FROM nodelist   
                    WHERE FIND_IN_SET(pid,ctemp)>0; 
                   END WHILE;  
                   RETURN ptemp;  
        END$$
    DELIMITER ;
    复制代码

    OK,查询可以通过将函数当做一个查询条件。

    SELECT * FROM nodelist WHERE FIND_IN_SET(id, getChild(3))

  • 相关阅读:
    基于 Docker 安装 RocketMQ
    167. 两数之和 II
    阿里云的使用
    自动关机程序
    C语言学习关于数据类型的一些知识点(初学者)
    关于C语言学习的一些感想(初学者)
    c# 第14节 字符方法、转义字符、字符串的方法
    c# 第13节 迭代语句、while、do...while、for、foreach、goto
    c# 第12节 分支语句if、switch、三位运算符
    c# 第11节 运算符大全
  • 原文地址:https://www.cnblogs.com/niudaxianren/p/10168956.html
Copyright © 2011-2022 走看看