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;
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;
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!