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, 7
  • 同様に、idFolder 3 の出力は次のようになります: 4, 5, 6, 7

解決策

提供されるソリューションは、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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!