Maison >base de données >tutoriel mysql >Comment puis-je trouver tous les nœuds parents d'une entrée spécifique dans une hiérarchie MySQL à l'aide d'une seule requête ?

Comment puis-je trouver tous les nœuds parents d'une entrée spécifique dans une hiérarchie MySQL à l'aide d'une seule requête ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-30 11:54:18343parcourir

How Can I Find All Parent Nodes of a Specific Entry in a MySQL Hierarchy Using a Single Query?

Recherche de tous les parents dans une table MySQL avec une seule requête (requête récursive)

Dans la gestion de bases de données, la récupération de données hiérarchiques peut souvent nécessiter des requêtes complexes impliquant des algorithmes récursifs. Un tel scénario se produit lorsque nous devons extraire tous les nœuds parents d'une entrée donnée dans un tableau hiérarchique comme celui présenté ci-dessus.

Défi :

Considérez le tableau fourni avec une hiérarchie d'éléments de menu , où chaque nœud a un ID, un titre et un ID parent. Notre objectif est de récupérer tous les nœuds parents de l'entrée portant le titre "Catégories" à l'aide d'une seule requête MySQL.

Solution :

Nous pouvons utiliser une requête récursive pour parcourir la table et accumuler les nœuds parents à chaque niveau. La requête suivante accomplit cela :

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 :

  • La sous-requête initialise deux variables utilisateur @r (identifiant du nœud actuel) et @l (niveau du nœud actuel ) avec les valeurs initiales 31 (identifiant de "Catégories") et 0, respectivement.
  • La requête externe parcourt la table, mettant à jour @r avec l'ID parent du nœud actuel et incrémentant @l pour garder une trace du niveau actuel.
  • Le résultat de la requête externe (T1) est joint à la table d'origine (T2) en fonction de la colonne commune _id.
  • Enfin, le résultat est trié par ordre décroissant de niveau pour présenter les nœuds parents de manière hiérarchique. order.

Sortie :

L'exécution de la requête produira la sortie souhaitée :

id title controller method url parent_id
3 Modules admin modules (NULL) 0
17 User Modules modules user_module (NULL) 3
31 Categories categories category (NULL) 17

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