MySQL の入れ子フォルダー構造の再帰クエリ
各フォルダーに ID がある、階層フォルダー構造を格納するテーブルを使用したシナリオを考えてみましょう。 、親フォルダー ID、および名前。テーブルは次のように設計されています:
folders_table ----------------------- id_folder id_folder_parent folder_name
課題は、単一の SELECT クエリを使用して特定のディレクトリのすべてのサブディレクトリを取得することです。
解決策: データベース構造の修正
1 つのアプローチには、再帰クエリを容易にするためにデータベース構造を変更することが含まれます。 id_folder_parent 列を介して間接的な関係を保存する代わりに、次の構造を使用することを検討してください。
folders_table ----------------------- id_folder folder_path folder_name
この更新された構造では、folder_path 列に、ルート ディレクトリから始まる階層内の各フォルダーの完全なパスが保存されます。これにより、再帰を使用したフォルダー構造の効率的なトラバースが可能になります。
再帰クエリ
データベース構造が変更されたら、次の再帰クエリを使用してすべてのサブディレクトリを取得できます。特定のディレクトリの:
WITH RECURSIVE FolderTraversal AS ( SELECT id_folder, folder_path, folder_name FROM folders_table WHERE id_folder = <directory_id> UNION ALL SELECT t.id_folder, t.folder_path, t.folder_name FROM folders_table AS t JOIN FolderTraversal AS p ON t.folder_path LIKE CONCAT(p.folder_path, '%/') ) SELECT id_folder, folder_path, folder_name FROM FolderTraversal;
上記のクエリでは、folder_path 列が使用されます再帰を定義します。現在のフォルダーのパスを次のフォルダーのパスに繰り返し追加し、ツリーのブランチを接続します。指定された directory_id でクエリを開始することにより、サブツリー全体を再帰的に走査します。
以上が再帰クエリを使用して MySQL の特定のディレクトリのすべてのサブディレクトリを効率的に取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。