Maison >base de données >tutoriel mysql >Comment la recherche en profondeur de MySQL peut-elle récupérer efficacement tous les ancêtres d'un nœud dans une structure hiérarchique ?

Comment la recherche en profondeur de MySQL peut-elle récupérer efficacement tous les ancêtres d'un nœud dans une structure hiérarchique ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-08 10:27:15158parcourir

How Can MySQL's Depth-First Search Effectively Retrieve All Ancestors of a Node in a Hierarchical Structure?

Requêtes hiérarchiques dans MySQL : parcourir l'ascendance avec la recherche en profondeur

La détermination des relations d'ascendance au sein des données hiérarchiques est une tâche courante dans la gestion de bases de données. Dans MySQL, les requêtes hiérarchiques vous permettent de naviguer et de récupérer efficacement les données des structures imbriquées.

Supposons que vous ayez une table nommée « matable » avec deux colonnes, « a » et « b », représentant un parent-enfant hiérarchique. relation :

| a | b |
----------
| 1 | 2 |
| 2 | 3 |
| 3 | 4 |
| 4 | 5 |
| 3 | 6 |
| 4 | 7 |

Considérons le scénario où vous souhaitez récupérer tous les ancêtres d'un nœud donné, par exemple trouver tous les parents, grands-parents, et ainsi de suite, du nœud 5.

Solution utilisant l'algorithme de recherche en profondeur :

MySQL fournit une solution de requête hiérarchique utilisant une recherche en profondeur d'abord (DFS ) approche. Voici une requête qui accomplit cela :

SELECT  @id :=
        (
        SELECT  senderid
        FROM    mytable
        WHERE   receiverid = @id
        ) AS person
FROM    (
        SELECT  @id := 5
        ) vars
STRAIGHT_JOIN
        mytable
WHERE   @id IS NOT NULL

Analyse :

  • La requête imbriquée initialise la variable '@id' avec le nœud (5) dont ancêtres que nous voulons trouver.
  • La requête externe récupère de manière itérative le parent direct du '@id' actuel en utilisant le Champ 'senderid' de 'mytable'.
  • Le 'STRAIGHT_JOIN' garantit que la requête suit la hiérarchie sans aucune optimisation qui pourrait contourner la relation parent-enfant.
  • La variable '@id' est mis à jour avec le 'senderid' du nœud parent à chaque itération, et le processus continue jusqu'à ce qu'il n'y en ait plus parents.

En exécutant cette requête, vous récupérerez une liste d'ancêtres pour le nœud 5 : 4, 3, 2 et 1. Cette méthode parcourt efficacement la hiérarchie en utilisant une approche DFS, vous permettant de naviguez dans des structures parent-enfant complexes dans votre base de données MySQL.

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