首页 >数据库 >mysql教程 >如何使用单个查询找到 MySQL 分层表中节点的所有祖先?

如何使用单个查询找到 MySQL 分层表中节点的所有祖先?

Susan Sarandon
Susan Sarandon原创
2024-11-26 18:29:11422浏览

How Can I Find All Ancestors of a Node in a MySQL Hierarchical Table Using a Single Query?

使用递归 CTE 通过单个查询查找 MySQL 表中的所有父项

在具有分层结构的数据库中,识别父项特定记录的分析可能是一项复杂的任务。在 MySQL 中,可以使用递归公用表表达式 (CTE) 有效地解决这一挑战。让我们探讨问题陈述及其解决方案。

问题陈述:

给定一个具有分层结构的 MySQL 表(例如提供的模式中的表),其中每行代表一个节点,具有 ID、标题、父 ID 和其他相关信息,任务是使用单个节点检索层次结构中特定节点的所有祖先(父节点)

解决方案:

提供的解决方案利用递归 CTE 来遍历层次结构并识别由其 ID 指定的节点的父节点。以下查询演示了该方法:

SELECT T2.id, T2.title, T2.controller, T2.method, T2.url
FROM (
    SELECT
        @r AS _id,
        (SELECT @r := parent_id FROM menu WHERE id = _id) AS parent_id,
        @l := @l + 1 AS lvl
    FROM
        (SELECT @r := 31, @l := 0) vars,
        menu m
    WHERE @r <> 0) T1
JOIN menu T2
ON T1._id = T2.id
ORDER BY T1.lvl DESC;

查询说明:

  • 子查询初始化两个用户定义的变量 @r 和 @l,并选择 ID 为 31 的指定记录(假设它是目标节点)。这些变量用于在递归迭代期间跟踪当前节点 ID (@r) 和级别 (@l)。
  • CTE 的递归部分重复获取当前节点的父 ID 并递增级别。这个过程一直持续到当前节点没有父节点(即@r为0)。
  • 外部查询根据_id(记录ID)将递归CTE与主表(菜单)连接起来以检索每个祖先的信息。
  • ORDER BY 子句按级别降序对结果进行排序,以分层方式显示祖先order。

此查询使用单个 SQL 语句高效检索指定节点的所有父节点,为在 MySQL 中导航分层数据提供方便且高性能的解决方案。

以上是如何使用单个查询找到 MySQL 分层表中节点的所有祖先?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn