Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL - Est-il possible d'obtenir tous les sous-éléments dans une hiérarchie ?

Il s'agit simplement d'un modèle de contiguïté table? Ensuite, il n'est pas possible dans une requête sans connaître la profondeur maximale.

Matière à réflexion :Gestion des données hiérarchiques dans MySQL (bien que je ne préconise pas l'utilisation du modèle d'ensemble imbriqué pour les données qui changent régulièrement).

Avec beaucoup de jointures (à gauche), plus précisément :avec autant de jointures à gauche que la profondeur maximale de l'arbre, ce sera possible en une seule requête. C'est la raison pour laquelle beaucoup de gens ont tendance à enregistrer la "profondeur" d'une catégorie spécifique, vous pourrez donc filtrer et limiter le nombre de jointures à la même table à un montant plus raisonnable.

Personnellement, pour modifier régulièrement les données :j'ai tendance à configurer un déclencheur sur une insertion/mise à jour, qui enregistrera/mettra en cache le 'chemin' actuel d'un nœud en fonction des identifiants (par exemple :un chemin est '12/62/28/345 ', dans lequel chaque étape entre le délimiteur / est la clé primaire d'un nœud parent dans le bon ordre (le parent de 345 est 28, le parent de 28 est 62, etc.)), donc je peux l'interroger avec une seule jointure comme celle-ci (/ utilisé comme séparateur) :

SELECT j.*
FROM tablename o
JOIN tablename j
WHERE j.path LIKE CONCAT (o.path,'/%')
AND  j.id != o.id  -- skip parent asked for.
WHERE o.id = <the id of the node you're looking for>;