Der er ingen enkelt SQL-forespørgsel som kan give dig resultater, som du forventer, baseret på denne tabelstruktur.
Der er to måder at løse problemet på:
-
Brug ekstern applikationslogik (uden for DB) til at foretage rekursive opkald, der vil opdage børn af hver kategori og bygge træet i applikationen.
-
Brug en af algoritmerne til lagring af trædata i en relationsdatabase. En af sådanne algoritmer kaldes
Ændret Preorder Tree Traversal
eller blot MPTT.
Forudsat at vi bruger kolonner lft
og rgt
for at vedligeholde venstre/højre indekser på tværs, når du indsætter en ny kategori, skal du:
-
Få oplysninger om overordnet kategori efter Id:
SELECT lft,rgt FROM tbl_categories WHERE categoryId=5
Lad os for et eksempel antage, at den overordnede kategori havdelft=7
ogrgt=10
(i dette tilfælde har den allerede ét barn) -
Giv plads til en ny post - flyt alle poster med 2 (1 for lft og 1 for rgt):
OPDATERING tbl_categories SET rgt=rgt+2 WHERE rgt>=10 BESTIL EFTER rgt DESC
OPDATERING tbl_categories SET lft=lft+2 WHERE lft>=10 BESTIL EFTER lft DESC
Bemærk her ORDER
aftagende. Som lft
og rgt
formodes at være unikke, anbefales det at lave en UNIQUE
begrænsning på dem, og derefter er faldende rækkefølge i opdatering nødvendig for at forhindre duplikerede nøglefejl.
-
Indstil
lft=
ogrgt=
og indsæt en ny post... INSERT INTO tbl_categories SET categoryName="New Child",parentCategoryId=5,lft=11,rgt=12,...
Du kan finde mere detaljerede eksempler med kode, hvis du søger efter MPTT PHP MySQL
. Der er en del tutorials om dette emne.