sql >> Databáze >  >> RDS >> Mysql

Existuje v MySQL alternativa `connect by`?

Jak bylo řečeno v komentářích, s mysql není krátká cesta.

ALE!

Máte-li možnost změnit strukturu databáze, můžete nasadit lepší návrh, který zvládne stromové hierarchie.

Pokud budete postupovat podle TENTO NÁVOD od Billa Karwina (ZDE je původní odpověď, která odkazuje na tento tutoriál prezentace), můžete najít 4 metody používané k modelování hierarchické struktury:

  1. Seznam Adiacency
  2. Výčet cesty
  3. Vnořené sady
  4. Uzavírací stůl

Nyní je nejlepší možný model 4. (popisy dalších 3 modelů nechávám na čtenáři), který v podstatě potřebuje 2 tabulky:jednu pro prvky a jednu pro cesty. V tabulce cest (samotná tabulka uzavření) uložíte každou cestu z každého uzlu ke každému potomkovi (nejen k přímým potomkům!).

Je doporučeno uložit také délku cesty pro každý řádek, protože to usnadňuje dotazování na bezprostřední potomky ve stromu.

I když toto řešení vyžaduje více místa, má nejlepší celkový výkon a je opravdu snadné jej používat:vůbec se nespoléhá na rekurzivní dotazy A poskytuje referenční integritu pro celou datovou sadu!

Například pro získání každého potomka uzlu #4:

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

Další příklad:získejte všechny předky uzlu #11

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

potřeba smazat podstrom uzlu #6

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


  1. URL souborů nebo jak otevřít složku z URL

  2. Mysql:Výběr hodnot mezi dvěma sloupci

  3. JPA + Hibernate:Jak definovat omezení s ON DELETE CASCADE

  4. Můžete použít agregované hodnoty v rámci ON DUPLICATE KEY