首页 >数据库 >mysql教程 >如何使用单个递归查询查找 MySQL 表中的所有父记录?

如何使用单个递归查询查找 MySQL 表中的所有父记录?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-06 18:59:12402浏览

How Can I Find All Parent Records in a MySQL Table Using a Single Recursive Query?

使用递归在 MySQL 表中查找父级

在数据库模式中,建立层次关系很常见。查询此类数据时,不仅需要检索特定记录,还需要检索它们的层次结构连接。本文将解决使用单个查询在 MySQL 表中查找记录的所有父级的任务。

问题陈述

给定一个包含列 ID、TITLE 的表、CONTROLLER、METHOD 和 PARENT_ID,使用单个 SQL 查找 TITLE 为“Categories”的记录的所有父项查询。

所需输出

输出应显示以下内容列:

  • id
  • 标题
  • 控制器
  • 方法
  • url
  • parent_id

并且应该获取记录:

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的递归查询功能。这是我们可以使用的 SQL 查询:

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;

让我们分解这个查询:

  • 内部查询 (SELECT @r AS _id, ...) 生成一个层次结构通过递归选择 PARENT_ID 并递增级别来记录。
  • 外部查询 (SELECT T2.id, ...)将内部查询与原表菜单(重命名为T2)连接起来,得到想要的数据。
  • ORDER BY 子句将结果按级别降序排序。

通过执行通过此查询,我们可以在单个数据库调用中检索标题为“类别”的记录的所有父项。

以上是如何使用单个递归查询查找 MySQL 表中的所有父记录?的详细内容。更多信息请关注PHP中文网其他相关文章!

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