如何在MySQL中實作遞歸資料夾檢索?
Nov 02, 2024 pm 02:47 PMMySQL 中子資料夾的遞歸檢索
使用分層資料結構時,有必要檢索子元素及其子子元素從資料庫中。對於代表資料夾的表,需要一個查詢來檢索給定父資料夾的所有子資料夾。
考慮我們有一個具有以下結構的資料夾表的場景:
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中文網其他相關文章!
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章
擊敗分裂小說需要多長時間?
3 週前
By DDD
倉庫:如何復興隊友
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前
By 尊渡假赌尊渡假赌尊渡假赌
公眾號網頁更新緩存難題:如何避免版本更新後舊緩存影響用戶體驗?
3 週前
By 王林

熱門文章
擊敗分裂小說需要多長時間?
3 週前
By DDD
倉庫:如何復興隊友
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前
By 尊渡假赌尊渡假赌尊渡假赌
公眾號網頁更新緩存難題:如何避免版本更新後舊緩存影響用戶體驗?
3 週前
By 王林

熱門文章標籤

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在 Linux 中運行 MySQl(有/沒有帶有 phpmyadmin 的 podman 容器)
