如何在MySQL中實作遞歸資料夾檢索?

Patricia Arquette
發布: 2024-11-02 14:47:30
原創
189 人瀏覽過

How to Implement Recursive Folder Retrieval in MySQL?

MySQL 中子資料夾的遞歸檢索

使用分層資料結構時,有必要檢索子元素及其子子元素從資料庫中。對於代表資料夾的表,需要一個查詢來檢索給定父資料夾的所有子資料夾。

考慮我們有一個具有以下結構的資料夾表的場景:

CREATE TABLE IF NOT EXISTS `Folder` (
    `idFolder` INT(11) NOT NULL AUTO_INCREMENT,
    `FolderName` VARCHAR(150) NOT NULL,
    `idFolderParent` INT(11) NULL,
    PRIMARY KEY (`idFolder`),
    CONSTRAINT `fk_1`
    FOREIGN KEY (`idFolderParent`)
    REFERENCES `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
登入後複製

挑戰

給定一個idFolder,目標是編寫一個檢索的單一查詢其所有子資料夾以及所有子子資料夾遞歸地。例如:

  • 當idFolder 為1 時,結果應為:2, 3, 4, 5, 6, 7
  • 對於idFolder 4,預期結果為:5, 6,>
  • 對於idFolder 4,預期結果為:5,6, 7
  • 同樣,對於idFolder 3,輸出應為:4, 5, 6, 7

SELECT GROUP_CONCAT(lv SEPARATOR ',') FROM (
  SELECT @pv:=(SELECT GROUP_CONCAT(idFolder SEPARATOR ',') FROM Folder 
WHERE FIND_IN_SET(idFolderParent, @pv)) AS lv FROM Folder 
JOIN
(SELECT @pv:=5) tmp
) a;
登入後複製

提供的解方案利用MySQL 使用者定義變數和子查詢的組合來實現遞歸檢索:

說明

查詢使用FIND_IN_SET() 函數檢查使用者定義變數@pvv的值中是否存在目前行的idFolderParent。如果是,則將該值附加到 lv 變數。子查詢產生多行,每行代表遞歸搜尋的一個層級。 透過使用帶有 SEPARATOR 子句的 GROUP_CONCAT() 函數,每行的結果將被組合併由指定的分隔符號分隔(在本例中) , 逗號)。最終結果是一個包含串聯子資料夾的字串。 此解決方案提供了一種強大的方法來遞歸檢索子資料夾和子子資料夾,即使資料庫中父資料夾的順序可能不是嚴格分層的。

以上是如何在MySQL中實作遞歸資料夾檢索?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!