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

select * from menu start with id='' 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('','a',NULL);
insert into `nodelist` (`id`, `nodecontent`, `pid`) values('','b','');
insert into `nodelist` (`id`, `nodecontent`, `pid`) values('','c','');
insert into `nodelist` (`id`, `nodecontent`, `pid`) values('','d','');
insert into `nodelist` (`id`, `nodecontent`, `pid`) values('','e','');
insert into `nodelist` (`id`, `nodecontent`, `pid`) values('','f','');
insert into `nodelist` (`id`, `nodecontent`, `pid`) values('','g','');
insert into `nodelist` (`id`, `nodecontent`, `pid`) values('','h','');
insert into `nodelist` (`id`, `nodecontent`, `pid`) values('','i','');
insert into `nodelist` (`id`, `nodecontent`, `pid`) values('','j','');

之后创建一个函数

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))

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

SELECT t1.id,t1.nodecontent,t2.nodecontent parentnodecontent FROM nodelist t1
LEFT JOIN nodelist t2
ON t1.pid = t2.id

可以了。

借鉴 https://www.jianshu.com/p/f99665266bb1

里面用到的内置函数 https://baijiahao.baidu.com/s?id=1595349117525189591&wfr=spider&for=pc

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

mysql树形结构递归查询的更多相关文章

  1. SQL 实现地区的实现树形结构递归查询(无限级分类),level为节点层级,由小至大依次

    //SQL 实现地区的实现树形结构递归查询(无限级分类),level为节点层级,由小至大依次 2018-09-25 StringBuilder areaSQL = new StringBuilder( ...

  2. MySQL 树形结构 根据指定节点 获取其所在全路径节点序列

    背景说明 需求:MySQL树形结构, 根据指定的节点,获取其所在全路径节点序列. 问题分析 1.可以使用类似Java这种面向对象的语言,对节点集合进行逻辑处理,获取全路径节点序列. 2.直接自定义My ...

  3. MySQL 树形结构 根据指定节点 获取其所有父节点序列

    背景说明 需求:MySQL树形结构, 根据指定的节点,获取其所有父节点序列. 问题分析 1.可以使用类似Java这种面向对象的语言,对节点集合进行逻辑处理,获取父节点. 2.直接自定义MySQL函数  ...

  4. MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)

    背景说明 需求:MySQL树形结构, 根据指定的节点,获取其下属的所有子节点(包含路径上的枝干节点和叶子节点) 枝干节点:如果一个节点下还有子节点,则为枝干节点. 叶子节点:如果一个节点下不再有子节点 ...

  5. MySQL 树形结构 根据指定节点 获取其所有叶子节点

    背景说明 需求:MySQL树形结构, 根据指定的节点,获取其下属的所有叶子节点. 叶子节点:如果一个节点下不再有子节点,则为叶子节点. 问题分析 1.可以使用类似Java这种面向对象的语言,对节点集合 ...

  6. MySQL树形结构的数据库表设计和查询

    1.邻接表(Adjacency List) 实例:现在有一个要存储一下公司的人员结构,大致层次结构如下: 那么怎么存储这个结构?并且要获取以下信息: 1.查询小天的直接上司. 2.查询老宋管理下的直属 ...

  7. SqlServer :实现树形结构递归查询(无限极分类)

    SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,CTE即公用表表达式 公用表表达式(CTE),是一个在查询中定义的临时命名结果集将在from子句中使用它.每个CTE仅被定义一 ...

  8. sqlserver实现树形结构递归查询(无限极分类)

    SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,CTE即公用表表达式 百度百科 公用表表达式(CTE),是一个在查询中定义的临时命名结果集将在from子句中使用它.每个CTE ...

  9. Greenplum(PostgreSql)使用 with recursive 实现树形结构递归查询并插入新表

    本代码目的是替代Oracle的connect by语句,并实现后者的path和idleaf功能. 正文开始: 假设表org,字段有 id(编号),name(名称),pid(上级编号), 最上级的记录p ...

随机推荐

  1. 探讨一个“无法创建JVM”的问题(已解决)

    ava版本:1.4 运行设置: -Xms1G -Xmx4G 报错: [ Incompatible initial and maximum heap sizes specified: ][ initia ...

  2. VueJS 集成 medium editor 自定义编辑器按钮

    详见我的新博客: 守望之吻

  3. 导航狗IT周报第十五期(July 8, 2018)

    摘要:Seclists.Org: 微信支付SDK存在XXE漏洞:WordPress 4.9.6存在文件删除漏洞:linux中常用的文件打包/解包与压缩/解压缩命令总结… 安全播报 Seclists.O ...

  4. gmail注册时“此电话号码无法用于进行验证”

    网上有几个方法,有说不要改默认地点,有说验证时直接写+86手机号,试了以后还是不行. 我的方法:换成IE浏览器,就可以验证了.

  5. 高通msm mdm 总结

    1. svn 获取工程代码命令:svn co svn+ssh://10.20.30.18/svn-repos/msm8916/branches/LA1.1-CS-r113502.2 2. 如何确定那些 ...

  6. redis的备份恢复

    说明:默认rdb方式保存,redis支持主从和哨兵等,但是在某些情况下我们会单机跑,所以有时候我们就会需要设计到备份恢复 环境:原始redis:192.168.1.200 新redis:192.168 ...

  7. Spring是什么+控制反转和依赖注入

    Spring是一个开源框架,是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架. 原因: (1)通过控制反转(IOC)达到松耦合,IOC也就是把控制权交出去,在使用中直接得到对象 (2)提 ...

  8. 关于Hazard Pointers的话题

    关于Hazard Pointers的话题, 起源于这个文章: 实现无锁的栈与队列(4) http://www.cnblogs.com/catch/p/3176636.html 其实他的系列文章(3)之 ...

  9. 【转载】python import和from import

    import和from import都是将其他模块导入当前模块中. 刚开始一直以为import和from import唯一的区别,就是from import可以少写一些模块名.虽然from XX im ...

  10. mac下docker中安装nodejs

    一.首先下载docker并安装 https://download.docker.com/mac/stable/Docker.dmg 然后启动docker, 二.获取node最新镜像 输入来着node版 ...