Maison > base de données > tutoriel mysql > Comment les requêtes récursives MySQL peuvent-elles récupérer efficacement tous les ancêtres d'un nœud enfant donné ?

Comment les requêtes récursives MySQL peuvent-elles récupérer efficacement tous les ancêtres d'un nœud enfant donné ?

DDD
Libérer: 2024-12-07 02:20:13
original
845 Les gens l'ont consulté

How Can MySQL Recursive Queries Efficiently Retrieve All Ancestors of a Given Child Node?

Requêtes hiérarchiques dans MySQL : récupération des relations avec les ancêtres

Pour gérer efficacement les données hiérarchiques, MySQL propose de puissantes requêtes récursives qui peuvent naviguer dans les relations à n'importe quelle profondeur . Cela devient particulièrement utile lorsque vous devez extraire des relations ancestrales.

Considérez la structure relationnelle suivante, où « a » représente le champ parent et « b » représente le champ enfant :

| a  | b  |
-----------
| 1  | 2  |
| 2  | 3  |
| 3  | 4  |
| 4  | 5  |
| 3  | 6  |
| 4  | 7  |
Copier après la connexion

Problème : Étant donné la valeur d'un champ enfant (par exemple, 5), déterminez tous ses champs parents, ses grands-parents, etc., quelle que soit la profondeur du champ hiérarchie.

Solution :

MySQL fournit une expression de table commune (CTE) récursive qui vous permet de naviguer efficacement dans les relations hiérarchiques :

WITH RECURSIVE Ancestors AS (
    SELECT  *
    FROM    mytable
    WHERE   b = 5
    UNION ALL
    SELECT  t1.*
    FROM    mytable t1
    JOIN    Ancestors t2 ON t1.a = t2.b
)
SELECT  a, b
FROM    Ancestors;
Copier après la connexion

Cette requête crée un CTE récursif nommé « Ancêtres » qui identifie de manière itérative les parents de chaque champ enfant dans la hiérarchie. Le CTE commence par sélectionner le champ enfant avec la valeur 5 (c'est-à-dire 5). Il joint ensuite « matable » à lui-même en utilisant les champs « a » (parent) et « b » (enfant). Ce processus récursif se poursuit jusqu'à ce qu'il n'y ait plus de champs parents à récupérer.

L'instruction SELECT finale extrait à la fois les champs « a » (parent) et « b » (enfant) du CTE « Ancêtres », fournissant ainsi le relation hiérarchique souhaitée.

Une fois exécutée, cette requête renvoie les résultats suivants :

a  | b
-----------
1  | 2
2  | 3
3  | 4
4  | 5
Copier après la connexion

Ainsi, elle récupère avec succès les parents, grands-parents et autres ancêtres de la valeur du champ enfant fourni.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal