ホームページ > データベース > mysql チュートリアル > 再帰クエリを使用して MySQL の特定のディレクトリのすべてのサブディレクトリを効率的に取得する方法

再帰クエリを使用して MySQL の特定のディレクトリのすべてのサブディレクトリを効率的に取得する方法

Susan Sarandon
リリース: 2025-01-03 22:28:44
オリジナル
778 人が閲覧しました

How to Efficiently Retrieve All Subdirectories of a Specific Directory in MySQL Using Recursive Queries?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート