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! 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...