Jeg er ikke sikker på, at jeg følger alt det, men det lyder som om, du vil have alle umiddelbare børn i kategori 5.
Her er en måde at gøre det på:
VÆLG barn.*FRA Kategori forælder JOIN Kategori barn TIL (child.lft MELLEM parent.lft OG parent.rgt) LEFT JOIN Kategori mellemliggende TIL (intermediate.lft> parent.lft OG intermediate.rgt intermediate.lft AND child.rgt
rediger: Okay, jeg forstår nu, at løsningen ovenfor kun er en del af det, du ønsker. Du ønsker:
- Direkte forfædre til CD-afspillere
- "onkler" til cd-afspillere (søskende til forfædre)
- Søskende til CD-afspillere
- Børn af cd-afspillere
Lad mig arbejde på det i et par minutter.
Her er hvad jeg er kommet frem til:
SELECT descendant.*, (current.lft MELLEM descendant.lft AND descendant.rgt) AS is_selected, COUNT(DISTINCT c.CategoryId) AS depthFROM Category currentJOIN Kategori valgt TIL (current.lft MELLEM valgt.lft select.rgt)JOIN Kategori efterkommer TIL (descendant.lft MELLEM selected.lft OG selected.rgt)VENSTRE JOIN Kategori mellem TIL (intermediate.lft> selected.lft OG intermediate.rgt intermediate.lft OG descendant.lft aktuel
er cd-afspillere
valgt
er forfædre til cd-afspillere (elektronik, bærbar elektronik, cd-afspillere)
efterkommer
er ethvert barn eller barnebarn osv. af hver valgt forfader
mellemliggende
er en efterkommer af hver valgte forfader, der også er en forælder til efterkommer
-- der må ikke være nogen af disse, derfor ER NULL
begrænsning.
c
er kæden af forfædre fra efterkommer
tilbage op til toppen med henblik på at bestemme dybden.
Jeg indså lige, at min løsning også ville returnere alle efterkommere af aktuelle
node. Så hvis du i øjeblikket så "bærbar elektronik", ville forespørgslen returnere sine børn, men den ville også returnere barnebarnets "flash", som måske ikke er, hvad du ønsker.