MySql/Oracle树形结构查询

摘要:
如下图所示。。。

Oracle树形结构递归查询

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

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

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

table: treeTable

MySql/Oracle树形结构查询第1张

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虽没有自带的语法支持,不过可以通过创建函数来实现递归查询。

如下图所示。。。

MySql/Oracle树形结构查询第2张

直接上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))

MySql/Oracle树形结构查询第7张

免责声明:文章转载自《MySql/Oracle树形结构查询》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#操作Redis List 列表内核如何启动根文件系统?下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mysql-8.0 安装教程(自定义配置文件,密码方式已修改)

下载zip安装包:   MySQL8.0 For Windows zip包下载地址:https://dev.mysql.com/downloads/file/?id=476233,进入页面后可以不登录。后点击底部“No thanks, just start my download.”即可开始下载。   或直接下载:https://dev.mysql.com...

Oracle数据库LOGGING&NOLOGGING模式概述

1.日志记录模式(LOGGING 、FORCE LOGGING 、NOLOGGING) 1.1三者的含义 LOGGING:当创建一个数据库对象时将记录日志信息到联机重做日志文件。LOGGING实际上是对象的一个属性,用来表示在创建对象时是否记录REDO日志,包括在做DML时是否记录REDO日志。一般表上不建议使用NOLOGGING,在创建索引或做大量数据...

MySQL update慢问题解决 规格严格

最近新做的一个项目要发布,结果在最终测试时候出问题了。后台的MySQL一直CPU使用率居高不行,通过: show processlist查看到一个SQL很异常,update XX set YY = KK where pK = ?; 这是一个简单的SQL,可是为什么他可能会影响问题呢。 背景: MySQL数据库,MyIsam表,按照时间建立一级分区,按照天建...

layui 二级联动

layui 二级联动 HTML 部分 <form onsubmit="return false;"action="__SELF__"data-auto="true"method="post"class='form-horizontal layui-form' style='padding-top:20px'><input type="h...

数据库表数据如何去重

表结构为: 表数据为: 表中数据可以看到name列中有两行数据是一致的,去重的SQL语句为: 1 delete from user where name in (select name from (select name from user group by name having count(name) > 1) ass1) 2 and id...

网络技能大赛A卷测试

  这个测试对我来言有些难度,短时间内做不了太多。首先是思路的理清,登录后的界面有好几种,而且公文的状态也有好几种。理清思路就花了一些时间 然后大致的框架做了做,然后将用户的增删改查还有公文的增删改查写了写。登录界面也完成了,不过不同角色登陆后的界面还没来得及做。主要就是功能太多,运用不熟练 数据库      bean层的基本信息 package c...