首頁  >  文章  >  資料庫  >  如何使用 MySQL 中的遞歸查詢來擷取嵌套層次結構中的所有後代資料夾?

如何使用 MySQL 中的遞歸查詢來擷取嵌套層次結構中的所有後代資料夾?

Patricia Arquette
Patricia Arquette原創
2024-11-05 16:04:02424瀏覽

How can I retrieve all descendant folders in a nested hierarchy using recursive queries in MySQL?

巢狀資料夾的遞迴查詢

取得具有多層巢狀的所有子資料夾和子子資料夾對MySQL 查詢提出了挑戰。雖然有多種方法,但本文將重點放在有效且全面的解決方案。

要從給定父級檢索所有後代資料夾,我們可以利用遞歸查詢,它允許在單一語句中進行巢狀計算。此方法涉及一個迭代過程,其中每個資料夾的 ID 用作下一次迭代的參數,每次循環都會擴展搜尋深度。

考慮以下場景:給定一個名為Folder 的資料庫表,其中包含列idFolder (auto -遞增主鍵)、FolderName 和idFolderParent(Folder.idFolder 的外鍵),我們用以下資料填入它:

idFolder FolderName idFolderParent
1 ADoc NULL
2 ADoc1 1
3 ADoc2 2
4 ADoc3 3
5 ADoc4 4
6 ADoc5 5
7 ADoc6 4

此結構允許我們建立巢狀資料夾層次結構。例如,如果我們查詢ADoc (idFolder=1) 的所有子資料夾,我們期望不僅檢索其直接子資料夾(ADoc1、ADoc2),而且還檢索它們下面的所有後代資料夾(ADoc3、ADoc4、ADoc5、ADoc6 、ADoc7) .

以下SQL 查詢使用遞歸迭代實現此目的:

<code class="sql">WITH RECURSIVE FolderHierarchy AS (
  SELECT idFolder, FolderName, idFolderParent
  FROM Folder
  WHERE idFolder = 1
  UNION ALL
  SELECT f.idFolder, f.FolderName, f.idFolderParent
  FROM FolderHierarchy AS h
  JOIN Folder AS f
    ON h.idFolderParent = f.idFolderParent
)
SELECT idFolder, FolderName
FROM FolderHierarchy;</code>

此查詢使用名為FolderHierarchy 的公用表表達式(CTE),該表達式最初選擇根資料夾(ADoc),然後遞歸將子資料夾加入層次結構。它會繼續此過程,直到不再有子資料夾為止,從而有效地收集所有後代。最終結果提供了 ID 和資料夾名稱的嵌套列表,允許檢索任意深度層級的所有子資料夾和子子資料夾。

以上是如何使用 MySQL 中的遞歸查詢來擷取嵌套層次結構中的所有後代資料夾?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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