---
title: "Hämta kategorier och underkategorier från samma tabell"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/145319-hämta-kategorier-och-underkategorier-från-samma-tabell"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "m_soderlund"
published: "2006-04-10T11:27:32.000Z"
updated: "2009-01-02T13:16:48.000Z"
replies: 15
views: 1034
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/145319-hämta-kategorier-och-underkategorier-från-samma-tabell"
---

# Hämta kategorier och underkategorier från samma tabell

## #1 — m_soderlund, 2006-04-10T11:27Z

I en applikation jag jobbar med ser tabellen tbl_categories ut så här:

catId
catName
parentCat

I denna tabell finns båda kategorier och underkategorier lagrade. En kategori har bara catId och catName ifyllt medan en underkategori även har parentCat ifylld och parentCat är id-numret (catId) för kategorin underkategorin tillhör.

Jag skulle vilja plocka ut alla kategorier och underkategorier och sortera dessa automagiskt så att tabellen dessa skrivs ut i ser ut så här:

Huvudkategori #1
 \- underkategori #1
 \- underkategori #2
 \- underkategori #3

Huvudkategori #2
 \- underkategori #4
 \- underkategori #5

osv. Hur gör jag? Jag har suttit en stund och testat JOIN på några sätt och vis, men idag är inte min logik på topp. :(

tpf

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

## #2 — @nders, 2006-04-10T11:31Z

Om det bara är två nivåer räcker det med att joina tabellen med sig själv.

```
SELECT catID, catName, parentCat FROM tbl_categories c1 
LEFT JOIN tbl_categories c2 ON c1.catID = c2.parentCat
ORDER BY c1.catID, c2.catID
```

Annars får du ge dig på något rekursivt.

mvh

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

## #3 — LarsG, 2006-04-10T11:33Z

```
select p.catName,c.catName
  from tbl_category p
  left join tbl_category c
  on p.catId = c.parentCat
  where p.parentCat is null
  order by p.catName,c.catName
```

själva presentationen med indentering får du hantera i ditt skript.

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

## #4 — m_soderlund, 2006-04-10T12:47Z

Tack för svaren!

Din SQL-fråga @nders, ger följande error:

> Microsoft JET Database Engine (0x80004005)
> Det angivna fältet 'catId' kan referera till fler än en av de tabeller som är uppräknade i SQL-uttryckets FROM-instruktion.

Denna SQL-frågam där jag lagt till c1 framför alla fält plockar enbart ut underkategorierna.

```
SELECT c2.catId, c2.catName, c2.parentCat FROM tbl_categories c1
LEFT JOIN tbl_categories c2 ON c1.catID = c2.parentCat
ORDER BY c1.catID, c2.catID
```

Vad kan nu vara problemet?

tpf :)

och just ja, det är gamla hederliga ms access det rör sig om..

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

## #5 — @nders, 2006-04-10T12:56Z

> Din SQL-fråga @nders, ger följande error:

Självklart, jag klantade mig.

Något sånt här kanske blir bättre?

```
SELECT c1.catID, c1.catName, c1.parentCat, 
c2.catID as subcatid, c2.catName as subcatname, c2.parentCat as subparentcat
FROM tbl_categories c1 
LEFT JOIN tbl_categories c2 ON c1.catID = c2.parentCat
ORDER BY c1.catID, c2.catID
```

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

## #6 — m_soderlund, 2006-04-10T12:57Z

LarsG: din SQL-fråga ger följande fel:

> ADODB.Recordset (0x800A0CC1)
> Objektet kunde inte hittas i mängden med det begärda namnet eller numret.

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

## #7 — @nders, 2006-04-10T12:58Z

Det är inte LarsGs SQL-fråga som ger det felet, utan din ASP-kod. Du försöker skriva ut ett fält som inte finns i recordsetet.

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

## #8 — m_soderlund, 2006-04-10T13:02Z

Det trodde jag med, men så är inte fallet (om nu inte det är fel att skriva ut rs("catName") i asp-koden). Jag återkommer strax!

Och @nders, din senaste SQL-fråga plockar ut alla kategorier precis som om jag hade använt följande SQL-fråga:

```
SELECT catId,catName,parentCat FROM tbl_categories ORDER BY catName
```

. :(

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

## #9 — @nders, 2006-04-10T13:09Z

Prova att lägga med villkoret från LarsGs SQL-fråga, jag kanske missuppfattade din fråga en aning...

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

## #10 — m_soderlund, 2006-04-10T13:16Z

```
SELECT c1.catID, c1.catName, c1.parentCat, c2.catID as subcatid, c2.catName as subcatname, c2.parentCat as subparentcat
FROM tbl_categories c1 LEFT JOIN tbl_categories c2 ON c1.catID = c2.parentCat
WHERE c1.parentCat is null ORDER BY c1.catID, c2.catID
```

plockar bara ut huvudkategorierna.

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

## #11 — m_soderlund, 2006-04-12T11:12Z

Är det någon som kan finna en lösning? :)

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

## #12 — m_soderlund, 2006-06-20T13:33Z

@nders my man. :f

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

## #13 — bassebhu, 2008-12-28T16:14Z

Väcker en gammal tråd ;P

Jag får inte sorteringen att funka riktigt. Jag vill ha det precis som söderlund skrev i första inlägget. Nu är min sortering inställd på att först ta ut huvudkategorierna och därefter underkategorierna, allt baserat på ID. Det jag vill är att allt ska komma i bokstavsordning, inte efter ID. När jag testade att sätta i bokstavsordning så fick jag både över och underkategorier i bokstavsordning, blandat. Som det ser ut nu så har jag ingen nytta av JOINen. HJÄLP :)  

```
$sql = "SELECT p.c_id AS id, p.c_parent_id AS parent_id, p.c_value AS value, c.c_id, c.c_parent_id, c.c_value
FROM categories p LEFT JOIN categories c ON p.c_id = c.c_parent_id
ORDER BY [b]p.c_id, c.c_id, p.c_value, c.c_value[/b]";
$result = mysql_query($sql);

$used_id = 0;
while($row = mysql_fetch_array($result)) {

	if($row['parent_id'] == NULL) {
		if(!($used_id == $row['id'])) {
			echo '<option value="' . $row['id'] . '">' . $row['value'] . "</option>\n";
			$used_id = $row['id'];
		}
	} else {
		echo '<option value="' . $row['id'] . '">&nbsp; &nbsp; ' . $row['value'] . "</option>\n";
	}

}
```

Tackar för svar!

e/
Jag får ju med dubletter för huvudkategorierna som jag filterar bort med php-koden, men kan detta göras redan i sql-frågan? Group, distinct eller nåt sånt?

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

## #14 — bassebhu, 2008-12-29T12:22Z

Förslag? Eller går inte detta med en SQL-fråga? Tack!

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

## #15 — bassebhu, 2008-12-30T16:07Z

En virtuell tårta till den som löser detta innan nyår :) heja!

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

## #16 — bassebhu, 2009-01-02T13:16Z

Yeah, jag är vass alltså!! Den som trixar han löser som jag aldrig har sagt förut!

Såhär blev det till slut! Körde INNER JOIN i stället då jag bara vill visa kategorier med underkategorier.

```
$sql = "SELECT p.c_id, p.c_parent_id, p.c_value, c.c_id AS sub_id, c.c_parent_id AS sub_parent_id, c.c_value AS sub_value
FROM categories p INNER JOIN categories c ON p.c_id = c.c_parent_id 
ORDER BY p.c_value, sub_value";
$result = mysql_query($sql);

$used_id = 0;
while($row = mysql_fetch_array($result)) {

  if(!($used_id == $row['c_id'])) {
    echo '<option value="0" class="cat_parent">' . $row['c_value'] . "</option>\n";
    echo '<option value="' . $row['sub_id'] . '">&nbsp; &nbsp; ' . $row['sub_value'] . "</option>\n";
    $used_id = $row['c_id'];
  } else {
    echo '<option value="' . $row['sub_id'] . '">&nbsp; &nbsp; ' . $row['sub_value'] . "</option>\n";
  }

}
```

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

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/145319-hämta-kategorier-och-underkategorier-från-samma-tabell
