首頁  >  文章  >  資料庫  >  如何在 MySQL 中遞歸查詢樹結構以尋找父節點的後代?

如何在 MySQL 中遞歸查詢樹結構以尋找父節點的後代?

Susan Sarandon
Susan Sarandon原創
2024-10-24 04:20:31510瀏覽

How to Recursively Query a Tree Structure in MySQL to Find Descendants of a Parent Node?

在MySQL 中遞歸樹結構

在關聯式資料庫中管理分層資料可能是一個挑戰,特別是在需要遞歸查詢時。在 MySQL 中,我們有一個特定的問題:如何有效地擷取給定父位置的所有後代,無論層次結構的深度為何。

問題:

考慮以下位置資料庫架構:

location (id, ....)
location_parent (location_id, parent_id)

位置表儲存位置信息,而location_parent 表定義位置之間的父子關係。

假設我們有一個帶有 ID 的位置5. 我們想要檢索其所有後代,包括那些多層深度的後代。

初始解決方案:

遞迴查詢的一種方法是使用自遞歸查詢連接如下:

<code class="sql">SELECT DISTINCT l.id
FROM location AS l
LEFT JOIN location_parent AS lp ON l.id = lp.child_id
WHERE lp.parent_id = 5
;</code>

此查詢將檢索位置5 的直接子級。但是,對於更深的後代,我們需要多次重複查詢,每次都使用上一個查詢的結果作為輸入下一個。對於大型層次結構,此方法效率低且不切實際。

建議解決方案:

此問題的建議解決方案是使用遞歸公用表表達式 (CTE)。 CTE 是一個臨時表,可以在單一查詢中定義和引用。

<code class="sql">WITH RECURSIVE descendants AS (
    SELECT id, parent_id
    FROM location_parent
    WHERE parent_id = 5
    UNION ALL
    SELECT lp.child_id, lp.parent_id
    FROM descendants AS d
    JOIN location_parent AS lp ON d.id = lp.parent_id
)
SELECT id
FROM descendants
;</code>

此查詢建立一個稱為後代的遞歸 CTE,它從位置 5 的直接子級開始。然後是 UNION ALL 子句添加先前選擇的後代的子代,有效地擴展查詢以包含任何深度的所有後代。

查詢的第二部分從後代 CTE 中選擇 id 列,這為我們提供了所有後代的列表地點。這種方法比自連接方法高效得多,並且可以處理任何深度的層次結構。

以上是如何在 MySQL 中遞歸查詢樹結構以尋找父節點的後代?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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