Maison > base de données > tutoriel mysql > Comment trouver tous les ancêtres d'un enregistrement dans une table MySQL à l'aide d'une seule requête récursive ?

Comment trouver tous les ancêtres d'un enregistrement dans une table MySQL à l'aide d'une seule requête récursive ?

Linda Hamilton
Libérer: 2024-12-08 07:31:11
original
538 Les gens l'ont consulté

How to Find All Ancestors of a Record in a MySQL Table Using a Single Recursive Query?

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

Considérez le schéma de table MySQL suivant avec des exemples de données :

| ID |             TITLE | CONTROLLER |            METHOD | PARENT_ID |
|----|-------------------|------------|-------------------|-----------|
|  1 |         Dashboard |      admin |         dashboard |         0 |
|  2 |           Content |      admin |           content |         0 |
|  3 |           Modules |      admin |           modules |         0 |
...
Copier après la connexion

Défi :

Notre l'objectif est de trouver tous les parents d'un enregistrement spécifique, à savoir celui avec title = 'Categories', à l'aide d'une seule requête SQL.

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

Solution :

Nous utilisons une expression de table commune récursive (CTE) pour parcourir la hiérarchie des tables et identifier tous ancêtres de l'enregistrement souhaité :

WITH RECURSIVE Parents AS (
    SELECT id, parent_id
    FROM menu
    WHERE id = 31
    UNION ALL
    SELECT m.id, m.parent_id
    FROM Parents AS p
    JOIN menu AS m ON p.parent_id = m.id
)
SELECT m.id, m.title, m.controller, m.method, m.url, m.parent_id
FROM Parents AS p
JOIN menu AS m ON p.id = m.id
ORDER BY p.id DESC;
Copier après la connexion

Explication :

  • Le CTE Parents est initialisé avec l'identifiant de l'enregistrement cible (31).
  • La partie récursive de la requête sélectionne tous les parents de l'enregistrement actuel, poursuivant ainsi le parcours.
  • Le La clause ORDER BY trie les résultats par ordre décroissant, le parent immédiat apparaissant en premier.

En exécutant cette requête, nous obtenons le résultat souhaité, répertoriant tous les parents de l'enregistrement Catégories.

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