Maison >base de données >tutoriel mysql >Comment récupérer tous les descendants dans une structure hiérarchique à l'aide de MySQL ?

Comment récupérer tous les descendants dans une structure hiérarchique à l'aide de MySQL ?

DDD
DDDoriginal
2024-11-04 12:08:29850parcourir

How to Retrieve All Descendants in a Hierarchical Structure Using MySQL?

Récupération de données enfants hiérarchiques dans MySQL : sélection récursive à plusieurs niveaux

Dans le domaine des requêtes de base de données, il devient souvent nécessaire d'extraire non seulement immédiatement des données sur les enfants mais aussi des informations sur les descendants à plusieurs niveaux. Ceci est particulièrement pertinent dans les structures hiérarchiques, telles que les organigrammes ou les systèmes de répertoires imbriqués.

Considérons une table de base de données nommée Dossier qui modélise un répertoire de fichiers. Chaque dossier possède un identifiant unique, un nom et un identifiant de dossier parent facultatif. Notre objectif ultime est de concevoir une requête qui, étant donné un ID de dossier parent spécifique, peut récupérer tous ses dossiers enfants, dossiers sous-enfants, etc., fournissant ainsi une vue hiérarchique complète.

Analyse des requêtes

La requête fournie exploite la fonction GROUP_CONCAT() de MySQL pour agréger les informations hiérarchiques. Il utilise une instruction SELECT imbriquée pour récupérer de manière itérative tous les dossiers enfants en concaténant leurs identifiants dans une liste séparée par des virgules. Cette liste est ensuite stockée dans une variable lv et utilisée comme filtre pour identifier progressivement des niveaux supplémentaires d'enfants.

L'instruction SELECT la plus externe regroupe simplement la liste concaténée des identifiants d'enfants pour chaque itération et les présente sous forme de virgule. chaîne séparée. En utilisant la fonction FIND_IN_SET(), la requête garantit que chaque enfant est recherché dans l'ensemble d'ID d'enfant précédemment identifiés.

Exécution

Considérez l'exemple d'ensemble de données :

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

Pour récupérer tous les dossiers enfants et leurs descendants pour le dossier parent ID 5, exécutez la requête suivante :

<code class="sql">SELECT GROUP_CONCAT(lv SEPARATOR ',') FROM (
SELECT @pv:=(SELECT GROUP_CONCAT(idFolder SEPARATOR ',') FROM Folder 
WHERE FIND_IN_SET(idFolderParent, @pv)) AS lv FROM Folder 
JOIN
(SELECT @pv:=5) tmp
) a;</code>

Le résultat sera une liste séparée par des virgules de tous les dossiers enfants et ID de sous-enfants :

6,7,2,3,4

Conclusion

La requête fournie offre une solution robuste pour récupérer les données hiérarchiques des enfants dans MySQL, fournissant une vue complète de la structure des dossiers et de ses relations imbriquées. Il traverse efficacement la hiérarchie sans nécessiter aucune modification de la structure de la base de données ni s'appuyer sur un ordre prédéfini des relations parent-enfant. Cette solution s'avère particulièrement précieuse dans la gestion de structures de données hiérarchiques complexes.

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