• 目标

数据库的一张表中,保存了 具有父子级关系的一组数据。1 根据主键id,递归查询它的所有子级;2 递归查询它的所有父级。

  • 示意图

  • 数据库建表语句

CREATE TABLE `tbl_tree` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8;

  • 递归查询所有子级(由上而下)

查询id为1的行,及其所有子级

WITH RECURSIVE td AS (
    SELECT * FROM tbl_tree WHERE id = 1
    UNION ALL
    SELECT c.* FROM tbl_tree c ,td WHERE c.parent_id = td.id
) SELECT * FROM td ORDER BY td.id;

  • 递归查询所有父级(由下向上)

查询id为10的行,及其所有父级

WITH RECURSIVE td AS (
    SELECT * FROM tbl_tree WHERE id = 10
    UNION ALL
    SELECT c.* FROM tbl_tree c, td WHERE c.id=td.parent_id
)SELECT * FROM td ORDER BY td.id;

  • (附)测试数据

INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('1', '0', '家配成品类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('2', '0', '营销物料类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('3', '1', '家配');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('4', '1', '寝具');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('5', '1', '衣百货');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('6', '2', '物料');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('7', '3', '凳类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('8', '3', '椅类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('9', '3', '床类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('10', '3', '餐椅类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('11', '3', '桌台类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('12', '3', '沙发类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('13', '3', '窗帘类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('14', '3', '茶几类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('15', '3', '床头柜类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('16', '3', '软床类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('17', '3', '按摩护理类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('18', '3', '其它配套类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('19', '4', '软床类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('20', '4', '床垫类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('21', '4', '床配类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('22', '4', '床头柜类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('23', '4', '排骨架类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('24', '4', '销售道具');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('25', '5', '礼包类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('26', '5', '日用品类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('27', '5', '家居饰品类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('28', '5', '家居小家电类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('29', '5', '其它功能五金类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('30', '6', '物料类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('31', '6', '服装物料类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('32', '6', '衣柜线宣传物料类');
INSERT INTO `test`.`tbl_tree` (`id`, `parent_id`, `name`) VALUES ('33', '6', '其他展示产品');

MySQL - 8 递归查询树结构相关推荐

  1. mysql递归sql_SQL如何实现MYSQL的递归查询,SQL实现MYSQL递归

    猿哥解读 本文的亮点在于很多PHPer肯定不知道MySQL还能这么用. 所周知,目前的mysql版本中并不支持直接的递归查询,但是通过递归到迭代转化的思路,还是可以在一句SQL内实现树的递归查询的.这 ...

  2. MySQL递归查询,Oracle递归查询,MyBatis+MySQL实现递归查询

    递归查询用于查询树形结构的列表,比如行政区列表.包括向下递归查询:根据父级查询子级:向上查询:根据子级查询父级.mysql需要使用存储函数,oracle可以使用connect by语句直接查询. My ...

  3. mysql 向上递归查询_mysql如何实现递归查询

    mysql实现递归查询的方法:首先创建表,并初始化数据:然后向下递归,利用[find_in_set()]函数和[group_concat()]函数实现递归查询. 本教程操作环境:windows7系统. ...

  4. MySQL实现递归查询

    文章目录 概述 测试环境 测试表 插入测试数据 开始测试 使用表连接 临时表+存储过程 使用函数 概述 前几日有客户咨询关于mysql实现递归查询的方法,当时简单了解了一下,觉得递归查询逻辑层面一种特 ...

  5. 同事问我MySQL怎么递归查询,我懵逼了...

    前言 最近在做的业务场景涉及到了数据库的递归查询.我们公司用的 Oracle ,众所周知,Oracle 自带有递归查询的功能,所以实现起来特别简单. 但是,我记得 MySQL 是没有递归查询功能的,那 ...

  6. mysql实现递归查询---使用存储过程

    说明:mysql不支持WITH RECURSIVE,不能像PostgreSQL数据库那样查询,需要使用到存储过程 1.创建表: DROP TABLE IF EXISTS `t_areainfo`; C ...

  7. MYSQL的递归查询

    众所周知,目前的mysql版本中并不支持直接的递归查询,但是通过递归到迭代转化的思路,还是可以在一句SQL内实现树的递归查询的.这个得益于Mysql允许在SQL语句内使用@变量.以下是示例代码. ## ...

  8. mysql反向递归查询_递归查询所有下级部门树形结构反向递归获取所有ID集合

    mysql递归搜索再之前得原创文档里已经写明了,这个网上比较多. 直接进入正题:原创手写反递归 package com.kb.nxccims.common.util; import java.util ...

  9. Java实现递归查询树结构

    我们在实际开发中,肯定会用到树结构,如部门树.菜单树等等.Java后台利用递归思路进行构建树形结构数据,返回给前端,能以下拉菜单等形式进行展示.今天,咱们就来说说怎么样将List集合转换成TreeLi ...

最新文章

  1. ASP.NET保持用户状态的九种选择
  2. 微信小程序动画无限循环 掉花
  3. Linux C++/Java/Web/OC Socket网络编程
  4. Python常用模块之logging模块
  5. JAVA 13 (集合框架)
  6. jasperreports_JasperReports:棘手的部分
  7. 数据结构实验之查找五:平方之哈希表
  8. mysql的dbconn_管道错误使用mysql.conn
  9. 杭电1166敌兵布阵(线段树)
  10. 宝塔面板nginx跨域配置(跳坑)
  11. c语言程序心得体会感想,c语言编程学习心得体会3篇
  12. 常系数非齐次线性微分方程和非齐次方程组的特解和齐次解的关系
  13. 摩克机器人_第三章 摩克都市的一场灾难(上)
  14. mysql不同分数的人数,mysql如何统计每个专业分数段的人数
  15. 类ChatGPT的部署与微调(上):从LLaMA、Alpaca/Vicuna/BELLE、中文版
  16. 计算机电源出现问题,电源故障引起的电脑问题
  17. MapStruct系列(6)-映射集合、映射Stream流、映射枚举
  18. Button点击事件
  19. 如何打赢呼叫中心人才管理前哨战
  20. VPC对等连接(VPC Peering)

热门文章

  1. 计算机是怎么样工作的?
  2. new Object()和Object.create()的区别
  3. 清洗枪市场现状研究分析与发展前景预测报告
  4. 人体中数量最多的神经元,人体内有多少个神经元
  5. 论文之Unrolled Optimization with Deep Priors 深先验展开优化
  6. Nginx+https+Trojan
  7. 基于Java的网络流量分析软件设计
  8. 如何应聘项目经理,或成为项目经理
  9. 西北乱跑娃 -- fastapi设置静态文件以及跨域访问
  10. Spring Boot教程(二十五)返回JSON格式