Maison >base de données >tutoriel mysql >Comment récupérer efficacement tous les sous-répertoires d'un répertoire spécifique dans MySQL à l'aide de requêtes récursives ?

Comment récupérer efficacement tous les sous-répertoires d'un répertoire spécifique dans MySQL à l'aide de requêtes récursives ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-03 22:28:44780parcourir

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

Requêtes récursives pour les structures de dossiers imbriquées dans MySQL

Considérez un scénario avec une table stockant une structure de dossiers hiérarchique, où chaque dossier a un ID , l'ID du dossier parent et un nom. La table est conçue comme suit :

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

Le défi est de récupérer tous les sous-répertoires d'un répertoire spécifique à l'aide d'une seule requête SELECT.

Solution : Réviser la structure de la base de données

Une approche consiste à modifier la structure de la base de données pour faciliter les requêtes récursives. Au lieu de stocker les relations indirectes via la colonne id_folder_parent, pensez à utiliser la structure suivante :

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

Dans cette structure mise à jour, la colonnefolder_path stocke le chemin complet de chaque dossier dans la hiérarchie, en commençant par le répertoire racine. Cela permet une navigation efficace dans la structure des dossiers en utilisant la récursion.

Requête récursive

Une fois la structure de la base de données modifiée, la requête récursive suivante peut être utilisée pour récupérer tous les sous-répertoires d'un répertoire spécifique :

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;

Dans la requête ci-dessus, la colonnefolder_path est utilisée pour définir la récursivité. Il ajoute de manière itérative le chemin du dossier actuel au chemin du dossier suivant, reliant les branches de l'arborescence. En démarrant la requête au répertoire_id spécifié, elle parcourt de manière récursive tout le sous-arbre.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn