Récurseur d'une structure arborescente dans MySQL
Lorsque vous travaillez avec des données hiérarchiques, il est souvent nécessaire de récupérer les descendants d'un nœud particulier dans l'arborescence structure. Dans le contexte de MySQL, où un emplacement peut se trouver à l'intérieur d'un autre emplacement, la tâche devient plus complexe à mesure que le nombre de niveaux augmente.
La requête PHP/MySQL fournie :
$sql = "SELECT id FROM se_locations_services WHERE parent_locationid IN ( SELECT location_id FROM se_locations_parent WHERE parent_id = '$locationid' )";
efficacement récupère les descendants immédiats d’un emplacement donné.
Cependant, pour récupérer tous les descendants, quelle que soit leur profondeur, une approche récursive est nécessaire. MySQL ne prend pas en charge nativement les requêtes récursives, mais il existe une solution élégante décrite dans l'article complet lié ci-dessous sur mysql.com :
[Gestion des données hiérarchiques dans MySQL](https://www.mysql.com/news -and-events/mysql-perspectives/performance-tuning-json-mysql-for-hierarchical-data/)
Cet article présente diverses approches pour gérer les données hiérarchiques, y compris la possibilité d'utiliser des CTE (Common Expressions de table) pour implémenter la récursion :
WITH RECURSIVE descendants (id, parent_id) AS ( SELECT id, parent_id FROM locations UNION ALL SELECT l.id, l.parent_id FROM locations l JOIN descendants d ON l.parent_id = d.id ) SELECT DISTINCT id FROM descendants WHERE parent_id = $locationid;
En employant l'opérateur UNION ALL, le CTE étend de manière itérative la liste des descendants, permettant à MySQL de récupérer la hiérarchie complète à partir d'une seule requête.
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!