Heim >Datenbank >MySQL-Tutorial >Wie kann ich mit rekursiven Abfragen effizient alle Unterverzeichnisse eines bestimmten Verzeichnisses in MySQL abrufen?

Wie kann ich mit rekursiven Abfragen effizient alle Unterverzeichnisse eines bestimmten Verzeichnisses in MySQL abrufen?

Susan Sarandon
Susan SarandonOriginal
2025-01-03 22:28:44780Durchsuche

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

Rekursive Abfragen für verschachtelte Ordnerstrukturen in MySQL

Stellen Sie sich ein Szenario mit einer Tabelle vor, die eine hierarchische Ordnerstruktur speichert, wobei jeder Ordner eine ID hat , die ID des übergeordneten Ordners und einen Namen. Die Tabelle ist wie folgt aufgebaut:

folders_table
-----------------------
id_folder
id_folder_parent
folder_name

Die Herausforderung besteht darin, alle Unterverzeichnisse eines bestimmten Verzeichnisses mit einer einzigen SELECT-Abfrage abzurufen.

Lösung: Überarbeitung der Datenbankstruktur

Ein Ansatz besteht darin, die Datenbankstruktur zu ändern, um rekursive Abfragen zu ermöglichen. Anstatt indirekte Beziehungen über die Spalte „id_folder_parent“ zu speichern, sollten Sie die folgende Struktur verwenden:

folders_table
-----------------------
id_folder
folder_path
folder_name

In dieser aktualisierten Struktur speichert die Spalte „folder_path“ den vollständigen Pfad jedes Ordners in der Hierarchie, beginnend mit dem Stammverzeichnis. Dies ermöglicht ein effizientes Durchlaufen der Ordnerstruktur mithilfe der Rekursion.

Rekursive Abfrage

Sobald die Datenbankstruktur geändert wurde, kann die folgende rekursive Abfrage verwendet werden, um alle Unterverzeichnisse abzurufen eines bestimmten Verzeichnisses:

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;

In der obigen Abfrage wird die Spalte „folder_path“ verwendet, um das zu definieren Rekursion. Es hängt den aktuellen Ordnerpfad iterativ an den Pfad des nächsten Ordners an und verbindet so die Baumzweige. Indem die Abfrage bei der angegebenen Verzeichnis-ID gestartet wird, durchläuft sie rekursiv den gesamten Unterbaum.

Das obige ist der detaillierte Inhalt vonWie kann ich mit rekursiven Abfragen effizient alle Unterverzeichnisse eines bestimmten Verzeichnisses in MySQL abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn