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!