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:
- Adiacency-lijst
- Padtelling
- Geneste sets
- 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)