Mysql
 sql >> Database >  >> RDS >> Mysql

Esiste un'alternativa "connect by" in MySQL?

Come detto nei commenti, non c'è una via breve con mysql.

MA!

Se hai la possibilità di modificare la struttura del database, puoi implementare un design migliore per gestire le gerarchie ad albero.

Se segui QUESTO TUTORIAL da Bill Karwin (QUI è la risposta originale che fa riferimento al tutorial della presentazione), puoi trovare 4 metodi utilizzati per modellare una struttura gerarchica:

  1. Elenco di aiacenza
  2. Enumerazione dei percorsi
  3. Set nidificati
  4. Tabella di chiusura

Ora, il miglior modello possibile è il 4° (lascio al lettore le descrizioni degli altri 3 modelli), che necessita sostanzialmente di 2 tabelle:una per gli elementi e una per i percorsi. Nella tabella dei percorsi (la tabella di chiusura stessa), memorizzerai ogni percorso da ogni nodo a ogni discendente (non solo i figli diretti!).

Si suggerisce di salvare anche la lunghezza del percorso per ogni riga, perché rende più facile interrogare i figli immediati nell'albero.

Anche se questa soluzione richiede più spazio, ha le migliori prestazioni complessive ed è davvero facile da usare:non si basa affatto su query ricorsive E garantisce l'integrità referenziale per l'intero set di dati!

Ad esempio, per ottenere ogni figlio del nodo #4:

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

Un altro esempio:ottieni tutti gli antenati del nodo #11

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

è necessario eliminare il sottoalbero del nodo #6

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