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

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

Linda Hamilton
Linda Hamilton原创
2024-12-08 07:31:11535浏览

How to Find All Ancestors of a Record in a MySQL Table Using a Single Recursive Query?

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

考虑以下 MySQL 表架构和示例数据:

| ID |             TITLE | CONTROLLER |            METHOD | PARENT_ID |
|----|-------------------|------------|-------------------|-----------|
|  1 |         Dashboard |      admin |         dashboard |         0 |
|  2 |           Content |      admin |           content |         0 |
|  3 |           Modules |      admin |           modules |         0 |
...

挑战:

我们的目标是使用单个记录查找特定记录的所有父记录,即标题=“类别”的记录SQL 查询。

所需输出:

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       

解决方案:

我们采用递归公用表表达式(CTE)来遍历表层次结构并识别所需的所有祖先记录:

WITH RECURSIVE Parents AS (
    SELECT id, parent_id
    FROM menu
    WHERE id = 31
    UNION ALL
    SELECT m.id, m.parent_id
    FROM Parents AS p
    JOIN menu AS m ON p.parent_id = m.id
)
SELECT m.id, m.title, m.controller, m.method, m.url, m.parent_id
FROM Parents AS p
JOIN menu AS m ON p.id = m.id
ORDER BY p.id DESC;

解释:

  • CTE 父级使用目标记录的 id (31) 进行初始化。
  • 查询的递归部分选择当前记录的所有父记录,继续遍历。
  • ORDER BY 子句按降序对结果进行排序,最先出现的是直接父级。

通过执行此查询,我们获得所需的输出,列出了类别记录。

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

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