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 が与えられた場合、目的は、以下を取得する単一のクエリを作成することです。そのすべての子フォルダーと、そのサブ子フォルダーを再帰的に実行します。例:
解決策
提供されるソリューションは、MySQL ユーザー定義変数とサブクエリの組み合わせを利用して再帰的取得を実現します。
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;
説明
クエリは FIND_IN_SET() 関数を利用します。ユーザー定義変数 @pv の値に現在の行の idFolderParent が存在するかどうかを確認します。存在する場合、値は lv 変数に追加されます。サブクエリは複数の行を生成し、それぞれが再帰的検索のレベルを表します。
SEPARATOR 句を指定して GROUP_CONCAT() 関数を使用すると、各行の結果が結合され、指定された区切り文字で区切られます (この場合)。 、カンマ)。最終結果は、連結された子フォルダーを含む文字列です。
このソリューションは、データベース内の親の順序が厳密に階層的でない場合でも、子フォルダーとサブ子フォルダーを再帰的に取得するための堅牢な方法を提供します。
以上がMySQL で再帰的なフォルダー取得を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。