博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql树形结构递归查询
阅读量:6094 次
发布时间:2019-06-20

本文共 1975 字,大约阅读时间需要 6 分钟。

之前一直用的是Oracle,对于树形查询可以使用start with ... connect by 

select * from menu start with id='130000' connect by id = prior parent_id;

 没错,这是Oracle所支持的

现在公司用的是mysql,对于这种查询方式只能通过sql语句实现了

语言都是相通的,何况sql呢

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

 

 如下图所示。。。

 

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

 

上面难度相对比较大,再补充一个简单的自连接查询

SELECT t1.id,t1.nodecontent,t2.nodecontent parentnodecontent FROM nodelist t1LEFT JOIN nodelist t2ON t1.pid = t2.id

可以了。

借鉴 

里面用到的内置函数

你只要能想到的,都有对应的解决方式,幸运的是你该踩得一些坑别人实现给你填好了。

转载于:https://www.cnblogs.com/chywx/p/9420726.html

你可能感兴趣的文章
ubuntu apt-get 安装 lnmp
查看>>
PHP下使用Redis消息队列发布微博
查看>>
焊盘 往同一个方向增加 固定的长度方法 总结
查看>>
执行存储过程返回游标集合转换成List
查看>>
(SQL)比较一个集合是否在另一个集合里存在的方法
查看>>
8. 多态——编译时类型&运行时类型
查看>>
逻辑运算
查看>>
Load Balanced 2
查看>>
Angular : 响应式编程, 组件间通信, 表单
查看>>
Python 软件开发目录规范
查看>>
修改OEM SYSMAN密码
查看>>
eclipse的maven、Scala环境搭建
查看>>
Redis配置集群二(window)
查看>>
window.top.location的作用
查看>>
11--PHP中的类和对象
查看>>
. ../ ./ /的意义
查看>>
架构师之路(一)- 什么是软件架构
查看>>
第十二周项目4-点、圆的关系
查看>>
团队项目计划会议
查看>>
使用C3P0连接池
查看>>