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

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

DDD
发布: 2024-11-30 19:23:15
原创
205 人浏览过

How to Find All Parent Entries in a MySQL Table Using a Single Recursive Query?

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

诸如菜单或类别之类的表通常具有层次结构,其中条目通过亲子关系相互关联。在这种情况下,检索特定条目的所有父项可能会成为一项挑战,尤其是在尝试使用单个查询执行此操作时。

考虑以下包含菜单条目的架构:

| ID |             TITLE | CONTROLLER |            METHOD | PARENT_ID |
|----|-------------------|------------|-------------------|-----------|
|  1 |         Dashboard |      admin |         dashboard |         0 |
|  2 |           Content |      admin |           content |         0 |
|  3 |           Modules |      admin |           modules |         0 |
|  4 |             Users |      admin |             users |         0 |
|  5 |          Settings |      admin |          settings |         0 |
|  6 |           Reports |      admin |           reports |         0 |
|  7 |              Help |      admin |              help |         0 |
|  8 |             Pages |    content |             pages |         2 |
|  9 |             Media |    content |             media |         2 |
| 10 |          Articles |    content |          articles |         2 |
| 11 |            Menues |    content |            menues |         2 |
| 12 |         Templates |    content |         templates |         2 |
| 13 |            Themes |    content |            themes |         2 |
| 14 |              Blog |    content |              blog |         2 |
| 15 |             Forum |    content |             forum |         2 |
| 16 |      Core Modules |    modules |       core_module |         3 |
| 17 |      User Modules |    modules |       user_module |         3 |
| 18 |         All Users |      users |         all_users |         4 |
| 19 |            Groups |      users |            groups |         4 |
| 20 |       Permissions |      users |       permissions |         4 |
| 21 | Import and Export |      users |     import_export |         4 |
| 22 |        Send Email |      users |         send_mail |         4 |
| 23 |     Login Records |      users |     login_records |         4 |
| 24 |  General Settings |   settings |  general_settings |         5 |
| 25 |    Email Settings |   settings |    email_settings |         5 |
| 26 |   Popular Content |    reports |   popular_content |         6 |
| 27 | Most Active Users |    reports | most_active_users |         6 |
| 28 |     Documentation |       help |     documentation |         7 |
| 29 |             About |       help |             about |         7 |
| 30 |          Products |   products |           product |        17 |
| 31 |        Categories | categories |          category |        17 |
登录后复制

目标是使用单个查询查找 ID 为 31(类别)的条目的所有父项。为了实现这一点,我们可以采用递归查询:

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;
登录后复制

此查询使用公共表表达式(CTE)来迭代检索条目的父项。 vars 子查询初始化变量@r 和@l,它们分别表示当前条目的ID 和递归级别。主子查询 T1 然后使用递归查询来查找当前条目的父级,同时递增级别。

最后,T1 CTE 与菜单表 T2 连接,以检索每个条目的详细信息父项。 ORDER BY T1.lvl DESC 子句按级别降序对结果进行排序,确保首先显示最接近的父级。

使用此递归查询,我们可以获得以下所需的输出:

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板