---
title: "Spara kategorier i flera nivåer på bästa sätt?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/177511-spara-kategorier-i-flera-nivåer-på-bästa-sätt"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "inspiro"
published: "2009-03-17T19:50:40.000Z"
updated: "2009-03-18T19:39:03.000Z"
replies: 5
views: 541
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/177511-spara-kategorier-i-flera-nivåer-på-bästa-sätt"
---

# Spara kategorier i flera nivåer på bästa sätt?

## #1 — inspiro, 2009-03-17T19:50Z

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?

Permalänk: https://www.webforum.nu/p/177511

## #2 — Peter S, 2009-03-17T19:56Z

Genom att en ParentId-modell låter det som att CTE kan vara lösningen: <http://msdn.microsoft.com/en-us/library/ms175972.aspx>

Permalänk: https://www.webforum.nu/p/2175623

## #3 — inspiro, 2009-03-17T21:33Z

Hej! Jo, kan det nog vara men det verkar himla knepigt, får det inte att fungera... min andra lösning, är den väldigt mycket långsammare?

Undrar också om det blir någon hastighetsökning att använda 101010 och datatypen int istället för en varchar och skriva nyckeln 10.10.10?

Permalänk: https://www.webforum.nu/p/2175634

## #4 — Peter S, 2009-03-18T17:13Z

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.

Permalänk: https://www.webforum.nu/p/2175737

## #5 — inspiro, 2009-03-18T19:17Z

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

Permalänk: https://www.webforum.nu/p/2175755

## #6 — dAEk, 2009-03-18T19:39Z

MySQL har en artikel om hur man kan spara och använda en hierarkisk struktur med en metod som de kallar för Nested Set Model. Det är inget jag använt mig av själv men det ser ganska sjyst ut. <http://dev.mysql.com/tech-resources/articles/hierarchical-data.html>

Finns det nån här som använt den metoden och kan säga några ord, lite snabbt bara?

Permalänk: https://www.webforum.nu/p/2175757

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/177511-spara-kategorier-i-flera-nivåer-på-bästa-sätt
