首頁  >  文章  >  資料庫  >  如何使用單一查詢找到 MySQL 分層表中節點的所有祖先?

如何使用單一查詢找到 MySQL 分層表中節點的所有祖先?

Susan Sarandon
Susan Sarandon原創
2024-11-26 18:29:11352瀏覽

How Can I Find All Ancestors of a Node in a MySQL Hierarchical Table Using a Single Query?

使用遞歸CTE 透過單一查詢尋找MySQL 表中的所有父項

在具有分層結構的資料庫中,辨識父項特定記錄的分析可能是一項複雜的任務。在 MySQL 中,可以使用遞歸公用表表達式 (CTE) 有效地解決這項挑戰。讓我們探討問題​​陳述及其解決方案。

問題陳述:

給定一個具有分層結構的MySQL 表(例如提供的模式中的表),其中每行代表一個節點,具有ID 、標題、父ID 和其他相關訊息,任務是使用單一節點檢索層次結構中特定節點的所有祖先(父節點)

解決方案:

提供的解決方案利用遞歸 CTE 來遍歷層次結構並識別由其 ID 指定的節點的父節點。以下查詢示範了該方法:

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 和@l,並選擇ID 為31 的指定記錄(假設它是目標節點)。這些變數用於在遞歸迭代期間追蹤當前節點 ID (@r) 和層級 (@l)。
  • CTE 的遞歸部分重複取得目前節點的父 ID 並遞增層級。這個過程一直持續到目前節點沒有父節點(即@r為0)。
  • 外部查詢根據_id(記錄ID)將遞歸CTE與主表(選單)連接起來以檢索每個祖先的資訊。
  • ORDER BY 子句依層級降序對結果排序,以分層方式顯示祖先order。

此查詢使用單一 SQL 語句有效地擷取指定節點的所有父節點,為在 MySQL 中導覽分層資料提供方便且高效能的解決方案。

以上是如何使用單一查詢找到 MySQL 分層表中節點的所有祖先?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn