Maison >base de données >tutoriel mysql >Comment puis-je trouver tous les ancêtres d'un nœud dans une table hiérarchique MySQL à l'aide d'une seule requête ?

Comment puis-je trouver tous les ancêtres d'un nœud dans une table hiérarchique MySQL à l'aide d'une seule requête ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-26 18:29:11372parcourir

How Can I Find All Ancestors of a Node in a MySQL Hierarchical Table Using a Single Query?

Rechercher tous les parents dans une table MySQL avec une seule requête utilisant un CTE récursif

Dans une base de données à structure hiérarchique, identifier les parents d'un enregistrement spécifique peut être une tâche complexe. Dans MySQL, ce défi peut être résolu efficacement à l'aide d'une expression de table commune récursive (CTE). Explorons l'énoncé du problème et sa solution.

Énoncé du problème :

Étant donné une table MySQL avec une structure hiérarchique (telle que celle du schéma fourni), où chaque ligne représente un nœud avec un ID, un titre, un ID parent et d'autres informations pertinentes, la tâche consiste à récupérer tous les ancêtres (parents) d'un nœud particulier dans la hiérarchie avec un seul requête.

Solution :

La solution fournie exploite un CTE récursif pour parcourir la hiérarchie et identifier les parents d'un nœud spécifié par son ID. La requête suivante illustre l'approche :

SELECT T2.id, T2.title, T2.controller, T2.method, T2.url
FROM (
    SELECT
        @r AS _id,
        (SELECT @r := parent_id FROM menu WHERE id = _id) AS parent_id,
        @l := @l + 1 AS lvl
    FROM
        (SELECT @r := 31, @l := 0) vars,
        menu m
    WHERE @r <> 0) T1
JOIN menu T2
ON T1._id = T2.id
ORDER BY T1.lvl DESC;

Explication de la requête :

  • La sous-requête initialise deux variables définies par l'utilisateur, @r et @l, et sélectionne l'enregistrement spécifié avec l'ID 31 (en supposant qu'il s'agit du nœud cible). Ces variables sont utilisées pour suivre l'ID du nœud actuel (@r) et le niveau (@l) lors de l'itération récursive.
  • La partie récursive du CTE récupère à plusieurs reprises l'ID parent du nœud actuel et incrémente le niveau. . Ce processus se poursuit jusqu'à ce que le nœud actuel n'ait plus de parent (c'est-à-dire que @r vaut 0).
  • La requête externe joint le CTE récursif à la table principale (menu) en fonction du _id (ID d'enregistrement) pour récupérer le informations pour chaque ancêtre.
  • La clause ORDER BY trie les résultats par ordre décroissant du niveau pour afficher les ancêtres de manière hiérarchique order.

Cette requête récupère efficacement tous les parents du nœud spécifié avec une seule instruction SQL, fournissant une solution pratique et performante pour naviguer dans les données hiérarchiques dans 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