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
Linda Hamiltonoriginal
2024-12-08 07:31:11562parcourir

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 |
...

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       

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;

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!

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