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

Existe-t-il une alternative "connect by" dans MySQL ?

Comme dit dans les commentaires, il n'y a pas de chemin court avec mysql.

MAIS !

Si vous avez la possibilité de modifier la structure de la base de données, vous pouvez déployer une meilleure conception pour gérer les hiérarchies arborescentes.

Si vous suivez CE TUTORIEL de Bill Karwin (ICI est la réponse originale qui fait référence à ce didacticiel de diaporama), vous pouvez trouver 4 méthodes utilisées pour modéliser une structure hiérarchique :

  1. Liste d'adiacence
  2. Énumération des chemins
  3. Ensembles imbriqués
  4. Tableau de fermeture

Maintenant, le meilleur modèle possible est le 4ème (je laisse les descriptions des 3 autres modèles au lecteur), qui nécessite essentiellement 2 tables :une pour les éléments et une pour les chemins. Dans la table des chemins (la table de fermeture elle-même), vous stockerez chaque chemin de chaque nœud à chaque descendant (pas seulement les enfants directs !).

Il est suggéré d'enregistrer également la longueur du chemin pour chaque ligne, car cela facilite la recherche d'enfants immédiats dans l'arborescence.

Même si cette solution nécessite plus d'espace, elle a les meilleures performances globales et elle est vraiment facile à utiliser :elle ne repose pas du tout sur des requêtes récursives ET elle garantit l'intégrité référentielle pour l'ensemble du jeu de données !

Par exemple, pour obtenir chaque enfant du nœud #4 :

select a.*
from nodes a
join paths b
on a.node_id = b.descendant
where b.ancestor = 4

Autre exemple :obtenir tous les ancêtres du nœud #11

select a.*
from nodes a
join paths b
on a.node_id = b.ancestor
where b.descendant = 11

besoin de supprimer la sous-arborescence du nœud #6

delete from paths where descendant in
(select descendant from paths where ancestor = 6)