首頁 >資料庫 >mysql教程 >如何使用單一遞歸查詢來尋找 MySQL 表中記錄的所有祖先?

如何使用單一遞歸查詢來尋找 MySQL 表中記錄的所有祖先?

Linda Hamilton
Linda Hamilton原創
2024-12-08 07:31:11531瀏覽

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