Mysql递归查询

递归查询是用于处理层次结构数据的查询,适合解决如树状结构、链表结构、组织架构等具有父子关系的数据。
二级目录

递归查询的用法和基本结构

递归查询主要分为三部分:

  1. 递归锚点(Base Query):递归的起始部分,它通常是查找树或链表的根节点,或指定起点。
  2. 递归部分(Recursive Query):这是递归调用的部分,用于查找和前一步相关的节点。它通过递归自我引用,逐层查询相关数据。
  3. 终止条件(Termination Condition):递归查询会不断执行,直到没有更多的子节点满足递归条件为止。

基本语法结构

java 复制代码
WITH RECURSIVE cte_name AS (
    -- 递归锚点
    SELECT initial_columns
    FROM table_name
    WHERE some_condition
  
    UNION ALL
  
    -- 递归部分
    SELECT recursive_columns
    FROM table_name
    INNER JOIN cte_name ON some_condition
)
SELECT * FROM cte_name;
  • WITH RECURSIVE:定义递归查询。
  • cte_name:递归公共表表达式的名称(临时表名)。
  • UNION ALL:将递归锚点的结果与递归部分合并,UNION ALL 常用于递归查询,因为它允许重复行。

递归查询示例

1. 查找所有子节点(树形结构)
假设有一个表 category,包含以下结构:
  • id:分类的唯一标识。
  • parentid:父分类的 id

现在要查找某个分类以及它的所有子分类:

sql 复制代码
WITH RECURSIVE category_hierarchy AS (
    -- 递归锚点:查找指定的分类节点
    SELECT id, name, parentid
    FROM category
    WHERE id = #{id}  -- 传入的初始分类 ID
  
    UNION ALL
  
    -- 递归部分:查找当前分类的所有子分类
    SELECT c.id, c.name, c.parentid
    FROM category c
    INNER JOIN category_hierarchy ch ON c.parentid = ch.id
)
-- 最终查询结果
SELECT * FROM category_hierarchy;

递归查询的工作原理

  1. 递归锚点:首先执行递归锚点的部分,查询出最初级的记录。例如,如果查找某个分类的所有子分类,锚点部分就是查找该分类的记录。
  2. 递归部分:递归部分会基于锚点的结果,查找相关的下级节点。每次递归都会更新子结果集,直到没有满足条件的记录为止。
  3. 终止条件:递归查询在没有更多数据时自动终止,无需明确指定。

**缺点:**递归查询会随着递归层级增加,导致查询时间增加。如果层级太深,可能会导致性能下降或查询超时,因此要控制递归层次。

可以通过限制递归层级来控制查询的深度,避免无限递归

sql 复制代码
SELECT * FROM category_hierarchy LIMIT 100;
相关推荐
tatasix36 分钟前
MySQL UPDATE语句执行链路解析
数据库·mysql
南城花随雪。1 小时前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了1 小时前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度1 小时前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮1 小时前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9992 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️2 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
Yz98762 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发
武子康3 小时前
大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本
java·大数据·数据仓库·hive·hadoop·mysql
黑色叉腰丶大魔王3 小时前
《MySQL 数据库备份与恢复》
mysql