Hej! Jag ska skapa grupper och undergrupper i flera nivåer i en sql-serverdatabas och skulle behöva lite hjälp med vilken modell som är bäst (ska användas till en "treeview" på en webb.
Exmpelvis så här ska det se ut:
A
A1
A2
A3
A3a
A3b
B
C
C1
C2
Viktigt är att jag kan hämta ut ALLA underkategorier till A, inte bara i ett led utan i flera led, i exemplet ovan så vill jag kunna få ut A3a och A3b genom att bara stå i A.
En lösning som jag vet fungerar är att ha en nyckel i databasen som ser ut så exempelvis här:
01.02.13
Vilket då betyder att jag befinner mig i huvudgruppen 01, i underkategorin 02 och sedan i en underkategori till den underkategorin 13.
Då kan jag få fram allt som finns under kategori 01 genom att skriva:
... LIKE '01%'
...och vill jag ha ut detsom finns i den tredje nivån (och neråt ytterligare om det finns ännu fler nivåer) genom att skriva
... LIKE '01.02.13%'
Men jag misstänker att detta är en dålig och långsam lösning? Ett alternativ är ju att använda ID och ParentID men jag lyckas inte få ut alla undernivåer i flera led från toppnivån? Några tips?
Prestandan kan jag inte bedöma. Men jag gissar att antalet kategorier inte är _så_ många att DBMS skulle få för sig att strejka och tycka att livet är ett helvete.
Hur menar du att du skulle kunna använda tal i stället?
Personligen skulle jag nog ändå försöka mig på CTE.
Tänkte att man kan använda tal om man förutsätter att varje kategori alltid består av 2 siffror (det blir aldrig fler än 99 i någon nivå ändå).
Men tjoho, jag tror jag har kommit en bra bit på vägen med CTE! :D Nu kan jag få fram alla underkategorier rekursivt under en kategori, fungerar klockrent och känns superdynamiskt. Så här ser koden ut:
WITH C(CategoryID, ParentID, Lvl, Field) AS
(
SELECT CategoryID, ParentID, 0 AS Lvl, Field
FROM Categories
[B][FONT="Arial Black"]WHERE ParentID IS NULL AND CategoryID = 2[/FONT][/B]
UNION ALL
SELECT e.CategoryID, e.ParentID, Lvl + 1, e.Field
FROM Categories e
INNER JOIN C
ON e.ParentID = C.CategoryID
)
SELECT CategoryID, ParentID, Lvl, Field
FROM C
...och vill jag utgå från en kategori längre ned i hierarkin är det bara att justera parentid och categoryid where-satsen (i fetstil).
Men om jag vill gå andra hållet, hur gör jag då? Säg att jag är längst ned i den sista underkategorin och vill veta alla överordnade kategorier? Det lyckas jag inte få ut...