sql >> Database >  >> RDS >> Mysql

Is er een `connect by`-alternatief in MySQL?

Zoals gezegd in opmerkingen, is er geen korte manier met mysql.

MAAR!

Als u de mogelijkheid heeft om de databasestructuur te wijzigen, kunt u een beter ontwerp implementeren om boomachtige hiërarchieën af te handelen.

Als je DEZE TUTORIAL volgt van Bill Karwin (HIER is het originele antwoord dat verwijst naar die tutorial met diavoorstelling), je kunt 4 methoden vinden die worden gebruikt om een ​​hiërarchische structuur te modelleren:

  1. Adiacency-lijst
  2. Padtelling
  3. Geneste sets
  4. Sluitingstabel

Het best mogelijke model is nu het 4e (ik laat beschrijvingen van de andere 3 modellen over aan de lezer), die eigenlijk 2 tabellen nodig heeft:een voor de elementen en een voor de paden. In de paths-tabel (de afsluitende tabel zelf) slaat u elk pad van elk knooppunt naar elke afstammeling op (niet alleen de directe onderliggende items!).

Het wordt aanbevolen om ook de padlengte voor elke rij op te slaan, omdat het gemakkelijker is om te zoeken naar directe kinderen in de boomstructuur.

Zelfs als deze oplossing meer ruimte nodig heeft, heeft hij de beste algehele prestaties en is hij heel gemakkelijk te gebruiken:hij vertrouwt helemaal niet op recursieve zoekopdrachten EN hij biedt referentiële integriteit voor de hele dataset!

Om bijvoorbeeld elk kind van het knooppunt #4 te krijgen:

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

Nog een voorbeeld:verkrijg alle voorouders van het knooppunt #11

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

moet de substructuur van het knooppunt #6 verwijderen

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


  1. Compatibiliteitsniveaus en Cardinality Estimation Primer

  2. Haal de waarde uit de database in geselecteerde tag HTML PHP MySQL

  3. CakePHP- en HABTM-modellimietfout

  4. Waarom retourneert LEFT JOIN van MySQL NULL-records met de WHERE-component?