Maison  >  Article  >  base de données  >  Comment récupérer de manière récursive tous les descendants dans une arborescence MySQL ?

Comment récupérer de manière récursive tous les descendants dans une arborescence MySQL ?

DDD
DDDoriginal
2024-10-23 19:45:30509parcourir

How to Recursively Retrieve All Descendants in a MySQL Tree Structure?

Récurseur d'une structure arborescente dans MySQL

Gérer des données hiérarchiques dans une base de données peut être un défi. Une approche courante consiste à utiliser une relation parent-enfant, comme le démontre la question posée. Bien que l'interrogation des descendants immédiats soit simple, la récupération de tous les descendants peut être plus complexe.

La documentation MySQL suggère plusieurs méthodes pour gérer les données hiérarchiques, notamment les suivantes :

  • Chemin Énumération : Cette méthode consiste à stocker le chemin de chaque nœud jusqu'à la racine de l'arborescence dans une colonne de base de données. Les requêtes peuvent ensuite utiliser cette colonne pour une récupération efficace des descendants.
  • Liste adjacente : Cette approche stocke les relations parent-enfant dans une seule table, chaque ligne représentant un nœud et son parent direct. Bien que simple à mettre en œuvre, elle nécessite plusieurs requêtes pour récupérer tous les descendants.
  • Ensembles imbriqués : Cette méthode plus avancée utilise une paire de colonnes pour stocker les positions gauche et droite de chaque nœud dans le arbre. Il offre une récupération efficace des descendants mais nécessite des mises à jour de table plus complexes.

Pour l'exemple donné, en utilisant la méthode Path Enumeration, la requête suivante récupérerait tous les descendants d'un emplacement parent :

WITH RECURSIVE descendant_path AS (
  SELECT id, path
  FROM locations
  WHERE id IN (SELECT location_id FROM location_parent WHERE parent_id = '$locationid')
  UNION ALL
  SELECT l.id, CONCAT(dp.path, ',', l.id)
  FROM locations l
  JOIN descendant_path dp ON l.path LIKE CONCAT(dp.path, '%')
)
SELECT id FROM descendant_path;

Cette requête utilise un CTE (Common Table Expression) récursif pour parcourir la structure arborescente et créer un chemin pour chaque emplacement descendant. En spécifiant l'emplacement de départ dans la requête initiale, tous les descendants peuvent être récupérés en un seul passage.

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