Maison > base de données > tutoriel mysql > Comment puis-je trouver tous les enregistrements parents dans une table MySQL à l'aide d'une seule requête récursive ?

Comment puis-je trouver tous les enregistrements parents dans une table MySQL à l'aide d'une seule requête récursive ?

Mary-Kate Olsen
Libérer: 2024-12-06 18:59:12
original
458 Les gens l'ont consulté

How Can I Find All Parent Records in a MySQL Table Using a Single Recursive Query?

Recherche de parents dans une table MySQL avec récursion

Dans un schéma de base de données, l'établissement de relations hiérarchiques est courant. Lors de l'interrogation de ces données, il devient nécessaire de récupérer non seulement des enregistrements spécifiques mais également leurs connexions hiérarchiques. Cet article abordera la tâche consistant à trouver tous les parents d'un enregistrement dans une table MySQL à l'aide d'une seule requête.

Énoncé du problème

Étant donné une table avec l'ID de colonnes, TITLE , CONTROLLER, METHOD et PARENT_ID, recherchez tous les parents d'un enregistrement dont le TITLE est "Catégories" à l'aide d'un seul code SQL. requête.

Sortie souhaitée

La sortie doit afficher ce qui suit colonnes :

  • id
  • titre
  • contrôleur
  • méthode
  • url
  • parent_id

et devrait récupérer le records :

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

Solution

Pour obtenir le résultat souhaité, nous devons exploiter les capacités de requêtes récursives de MySQL. Voici la requête SQL que nous pouvons utiliser :

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;
Copier après la connexion

Décomposons cette requête :

  • La requête interne (SELECT @r AS _id, ...) génère une hiérarchie de enregistrements en sélectionnant récursivement le PARENT_ID et en incrémentant le niveau.
  • La requête externe (SELECT T2.id, ...) rejoint la requête interne avec le menu de la table d'origine (renommé T2) pour obtenir les données souhaitées.
  • La clause ORDER BY trie les résultats par niveau par ordre décroissant.

En exécutant cette requête, nous peut récupérer tous les parents de l'enregistrement avec TITLE comme "Catégories" en un seul appel à la base de données.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal