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,目標是編寫一個檢索的單一查詢其所有子資料夾以及所有子子資料夾遞歸地。例如:
解
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中文網其他相關文章!