Maison >base de données >tutoriel mysql >Comment puis-je récupérer tous les dossiers descendants dans une hiérarchie imbriquée à l'aide de requêtes récursives dans MySQL ?

Comment puis-je récupérer tous les dossiers descendants dans une hiérarchie imbriquée à l'aide de requêtes récursives dans MySQL ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-05 16:04:02509parcourir

How can I retrieve all descendant folders in a nested hierarchy using recursive queries in MySQL?

Requête récursive pour les dossiers imbriqués

L'obtention de tous les dossiers enfants et sous-enfants avec plusieurs niveaux d'imbrication présente un défi pour les requêtes MySQL. Bien qu'il existe différentes approches, cet article se concentrera sur une solution efficace et complète.

Pour récupérer tous les dossiers descendants d'un parent donné, nous pouvons utiliser des requêtes récursives, qui permettent des calculs imbriqués dans une seule instruction. Cette méthode implique un processus itératif, dans lequel l'ID de chaque dossier est utilisé comme paramètre pour l'itération suivante, augmentant ainsi la profondeur de recherche à chaque cycle.

Considérez ce scénario : étant donné une table de base de données nommée Dossier avec des colonnes idFolder (auto -clé primaire incrémentée), FolderName et idFolderParent (clé étrangère de Folder.idFolder), nous le remplissons avec les données suivantes :

idFolder FolderName idFolderParent
1 ADoc NULL
2 ADoc1 1
3 ADoc2 2
4 ADoc3 3
5 ADoc4 4
6 ADoc5 5
7 ADoc6 4

Cette structure nous permet de créer des hiérarchies de dossiers imbriquées. Par exemple, si nous recherchons tous les dossiers enfants d'ADoc (idFolder=1), nous espérons récupérer non seulement ses enfants immédiats (ADoc1, ADoc2), mais également tous les dossiers descendants situés en dessous (ADoc3, ADoc4, ADoc5, ADoc6, ADoc7). .

La requête SQL suivante y parvient en utilisant une itération récursive :

<code class="sql">WITH RECURSIVE FolderHierarchy AS (
  SELECT idFolder, FolderName, idFolderParent
  FROM Folder
  WHERE idFolder = 1
  UNION ALL
  SELECT f.idFolder, f.FolderName, f.idFolderParent
  FROM FolderHierarchy AS h
  JOIN Folder AS f
    ON h.idFolderParent = f.idFolderParent
)
SELECT idFolder, FolderName
FROM FolderHierarchy;</code>

Cette requête utilise une expression de table commune (CTE) nommée FolderHierarchy qui sélectionne initialement le dossier racine (ADoc), puis de manière récursive joint les dossiers enfants à la hiérarchie. Il continue ce processus jusqu'à ce qu'il ne reste plus de dossiers enfants, collectant ainsi tous les descendants. Le résultat final fournit une liste imbriquée d'identifiants et de noms de dossiers, permettant la récupération de tous les dossiers enfants et sous-enfants avec n'importe quel niveau de profondeur.

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