首页 >数据库 >mysql教程 >如何使用单个查询查找 MySQL 层次结构中特定条目的所有父节点?

如何使用单个查询查找 MySQL 层次结构中特定条目的所有父节点?

Linda Hamilton
Linda Hamilton原创
2024-11-30 11:54:18420浏览

How Can I Find All Parent Nodes of a Specific Entry in a MySQL Hierarchy Using a Single Query?

使用单个查询查找 MySQL 表中的所有父项(递归查询)

在数据库管理中,检索分层数据通常需要涉及递归算法的复杂查询。当我们需要提取分层表中给定条目的所有父节点(如上面所示)时,就会出现这样一种情况。

挑战:

考虑提供的具有菜单项层次结构的表,其中每个节点都有一个 ID、标题和父 ID。我们的目标是使用单个 MySQL 查询获取标题为“Categories”的条目的所有父节点。

解决方案:

我们可以使用递归查询来遍历表并累积每个级别的父节点。以下查询完成此操作:

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(当前节点的id)和@l(当前节点的级别) ),初始值分别为 31(“类别”的 id)和 0。
  • 外部查询迭代表,使用当前节点的父 ID 更新 @r 并递增 @l 以跟踪当前级别。
  • 外部查询(T1)的结果与基于原始表(T2)的连接在公共列_id上。
  • 最后将结果按lvl降序排序,以分层方式呈现父节点order.

输出:

运行查询将产生所需的输出:

id title controller method url parent_id
3 Modules admin modules (NULL) 0
17 User Modules modules user_module (NULL) 3
31 Categories categories category (NULL) 17

以上是如何使用单个查询查找 MySQL 层次结构中特定条目的所有父节点?的详细内容。更多信息请关注PHP中文网其他相关文章!

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