Maison > base de données > tutoriel mysql > Comment puis-je interroger efficacement les descendants et les ancêtres dans une arborescence MySQL ?

Comment puis-je interroger efficacement les descendants et les ancêtres dans une arborescence MySQL ?

DDD
Libérer: 2025-01-06 18:24:10
original
372 Les gens l'ont consulté

How Can I Efficiently Query Descendants and Ancestors in a MySQL Tree Structure?

Requête de structure arborescente à requête unique dans MySQL

En SQL, les structures arborescentes sont souvent stockées dans des tables avec des colonnes pour l'ID, les données et identifiant des parents. Récupérer tous les descendants ou ancêtres d'une ligne spécifique peut être difficile, surtout compte tenu de leur profondeur potentiellement inconnue.

Requête de descendants

Pour récupérer tous les descendants d'une ligne spécifique, nous pouvons utiliser une technique appelée Modified Preorder Tree Traversal. Comme décrit par Joe Celko dans « Trees and Hierarchies in SQL for Smarties », cette approche implique la création d'une expression de table commune (CTE) récursive avec la structure suivante :

WITH RECURSIVE Descendants AS (
  SELECT id, data, parent_id
  FROM tree_table
  WHERE id = <starting_row_id>
  UNION ALL
  SELECT t.id, t.data, t.parent_id
  FROM Descendants AS T
  JOIN tree_table t ON t.parent_id = T.id
)
SELECT * FROM Descendants;
Copier après la connexion

Cette CTE identifie de manière récursive toutes les lignes enfants pour la ligne de départ donnée, puis continue à travers la hiérarchie jusqu'à ce qu'elle atteigne les nœuds feuilles.

Requête pour Ancêtres

Pour récupérer tous les ancêtres d'une ligne spécifique, nous pouvons utiliser une approche similaire avec une légère modification :

WITH RECURSIVE Ancestors AS (
  SELECT id, data, parent_id
  FROM tree_table
  WHERE id = <starting_row_id>
  UNION ALL
  SELECT t.id, t.data, t.parent_id
  FROM Ancestors AS T
  JOIN tree_table t ON t.id = T.parent_id
)
SELECT * FROM Ancestors;
Copier après la connexion

Ce CTE identifie de manière récursive toutes les lignes parentes pour le départ donné ligne, puis continue vers le haut dans la hiérarchie jusqu'à atteindre le nœud racine.

Exemple Implémentation

Un exemple fonctionnel de ces requêtes en PHP peut être trouvé sur : http://www.sitepoint.com/article/hierarchical-data-database/2/

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