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 ?
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!