SQL的递归查询子/父节点结构(MySQL)

这篇具有很好参考价值的文章主要介绍了SQL的递归查询子/父节点结构(MySQL)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当数据库中存储了树型结构的数据,例如城市表时,我们要搜索一个城市的所有父级城市或所有的子级城市,首先想到的就是利用SQL的递归查询,来看下面的MySQL例子(下列例子MySQL只适用于8.0版本及以上):

  1. 下载SQL,执行
    表结构和数据SQL文件下载(该文件中中国城市可能不全,数据仅供测试使用)

  2. 向下查询(不包含自己)
    比如我们要查山东省的下级所有城市,拿到山东省这条数据的id:370000

    with recursive tb (id, name, parentid) as
    (
      select id, name, parentid 
    	from city 
    	where parentid = 370000
    	
      union all
    	
      select c.id, c.name, c.parentid
    	from city c 
    	join tb t 
    	on c.parentid = t.id
    )
    select *
    from tb;
    

    查询结果如下
    SQL的递归查询子/父节点结构(MySQL)

  3. 向上查询
    比如我们要查历下区的上级所有城市,拿到历下区这条数据的id:370102

    with recursive tb (id, name, parentid) as
    (
      select id, name, parentid 
    	from city 
    	where id = 370102
    	
      union all
    	
      select c.id, c.name, c.parentid
    	from city c 
    	join tb t 
    	on c.id = t.parentid
    )
    select *
    from tb;
    

    查询结果如下:
    SQL的递归查询子/父节点结构(MySQL)

当然,我们有时候要查的是上下级的对应关系。
比如我要查出历下区与所有上级城市的关系:中国-山东省-济南市-历下区
或者要查出一个城市下的所有城市与上级城市的关系,只需对上面的SQL稍加修改就可以了:

  1. 一个城市下的所有城市与上级城市的关系
    第一个select中查询条件为该城市的id,在第二个delect中进行拼接处理,拼接字符自选
    拿山东省为例,山东省的id为370000

    with recursive tb (id, name, parentid) as
    (
     select id, name, parentid 
       from city 
       where id = 370000
       
     union all
       
     select c.id, concat(t.name, '-', c.name) as name, c.parentid
       from city c 
       join tb t 
       on c.parentid = t.id
    )
    select id, name 
    from tb;
    

    查询结果如下:
    SQL的递归查询子/父节点结构(MySQL)

  2. 某一城市的父级城市关系
    还是拿历下区举例,拿到id370102

    with recursive tb (id, name, parentid) as
    (
      select id, name, parentid 
    	from city 
    	where id = 370102
    	
      union all
    	
      select c.id, concat(c.name, '-', t.name) as name, c.parentid
    	from city c 
    	join tb t 
    	on c.id = t.parentid
    )
    select name 
    from tb where parentid = 0;
    

    查询结果如下:
    SQL的递归查询子/父节点结构(MySQL)

其他数据库如DB2等也可以按照同样的思路进行查询,不过需要注意的是其他数据库的SQL语句在with递归的使用和拼接函数concat的使用上可能有不同,进行替换就好文章来源地址https://www.toymoban.com/news/detail-434960.html

到了这里,关于SQL的递归查询子/父节点结构(MySQL)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQl数据库第八课-------SQL命令查询-------主要命脉

     欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com —————————————————————————————— 查询数据         条件         逻辑运算符         模糊查询         范围查询 in         判断空 UNION  排序 聚合 分组:gro

    2024年02月16日
    浏览(53)
  • Python MySQL 数据库查询:选择数据、使用筛选条件、防止 SQL 注入

    要从MySQL中的表格中选择数据,请使用\\\"SELECT\\\"语句: 示例选择\\\"customers\\\"表格中的所有记录,并显示结果: 注意 :我们使用 fetchall() 方法,该方法从上次执行的语句中获取所有行。 要仅选择表格中的某些列,请使用\\\"SELECT\\\"语句,后跟列名: 示例仅选择name和address列: 如果您只对

    2024年02月05日
    浏览(95)
  • MySQL数据库干货_16—— SQL99标准中的查询

    SQL99标准中的查询 MySQL5.7 支持部分的SQL99 标准。 SQL99中的交叉连接(CROSS JOIN) 示例: 使用交叉连接查询 employees 表与 departments 表。 SQL99中的自然连接(NATURAL JOIN) 自然连接 连接只能发生在两个表中有相同名字和数据类型的列上。如果列有相同的名字,但数据类型不同,NATURAL J

    2024年02月06日
    浏览(63)
  • 【MySQL】MySQL PHP 语法,PHP MySQL 简介,查询,下载 MySQL 数据库, SQL 教程

    作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 MySQL 可应用于多种语言,包括 PERL, C, C++, JAVA 和 PHP,在这些语言中,MySQL 在 PHP 的 web 开发中是应用最广泛。 我们

    2024年02月11日
    浏览(58)
  • MySQL数据库增删改查及聚合查询SQL语句学习汇总

    目录 数据库增删改查SQL语句 MySQL数据库指令 1.查询数据库 2.创建数据库 3.删除数据库 4.选择数据库 创建表table   查看所有表 创建表 查看指定表的结构 删除表 数据库命令进行注释 增删改查(CRUD)详细说明 增加 SQL库提供了关于时间的函数:now()  查询 查询表作列与列之间进

    2024年02月09日
    浏览(86)
  • SQL Server、MySQL和Oracle数据库分页查询的区别与联系

    摘要:本文将通过一个现实例子,详细解释SQL Server、MySQL和Oracle这三种常见关系型数据库在分页查询方面的区别与联系。我们将提供具体场景下的SQL语句示例,并解释每个数据库的分页查询用法以及优化方法,帮助读者更好地选择适合自己需求的分页查询方式。 假设我们有一

    2024年02月11日
    浏览(56)
  • Mysql-------SQL:DDL数据定义语言、DDM数据操作语言、DQL数据库查询语言、DQL数据控制语言

    SQL语言可以分为: DDL(Data Definition Language)语言:数据定义语言,用于 创建或更改数据库中的表、视图、索引等对象 DML(Data Manipulation Language)语言:数据操作语言,用来对 数据库表中的数据进行增删改查操作; DQL(Data Query Language)语言: 数据查询语言,用来查询数据库

    2024年02月13日
    浏览(75)
  • JSP 学生成绩查询管理系统eclipse开发sql数据库serlvet框架bs模式java编程MVC结构

    一、源码特点   JSP 学生成绩查询管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,比较流行的servlet框架系统具有完整的源代码和数据库,eclipse开发系统主要采用B/S模式 开发。 java 学生成绩查询管理系统 代码下载链接 https://download.csdn.net/download/qq_412

    2024年02月05日
    浏览(67)
  • sql递归查询处理树状结构数据,适用于sqlserver和oracle

    在工作中用到根据某个组织的ID,查询当前所有的上级,并按层级返回 递归语法: 以with开头,再以2个查询用 union all连接,且2个查询列表字段和类型返回必须一致 向上查询数据,oo是最终返回的表,也可以写为with oo as .... 但是不能写为 with oo(FID,fname_l2 ,FPARENTID)  去掉某一

    2024年01月23日
    浏览(56)
  • 关系数据库SQL数据查询

    1.查询仅涉及一个表,选择表中的若干列 查询全部列 选出所有属性列: 在SELECT后面列出所有列名 将目标列表达式指定为 * 查询经过计算的值 SELECT子句的目标列表达式不仅可以为表中的属性列,也可以是表达式 使用列别名改变查询结果的列标题: 2.选择表中的若干元组

    2024年02月09日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包