Maison  >  Article  >  base de données  >  Comment parcourir de manière récursive une structure arborescente dans MySQL ?

Comment parcourir de manière récursive une structure arborescente dans MySQL ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-24 04:59:02237parcourir

How to Recursively Traverse a Tree Structure in MySQL?

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!

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