webForumDet fria alternativet

Hämta kategorier och underkategorier från samma tabell

Databaser & SQLur Databashanterare & SQL

15 svar · 1 003 visningar · startad av m_soderlund

Medlem sedan sep. 20026 425 inlägg
Frågan#1

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

Medlem sedan juni 200032 967 inlägg
#2

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

Medlem sedan dec. 200012 464 inlägg
#3
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.

Medlem sedan sep. 20026 425 inlägg
#4

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

Medlem sedan juni 200032 967 inlägg
#5

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
Medlem sedan sep. 20026 425 inlägg
#6

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.

Medlem sedan juni 200032 967 inlägg
#7

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.

Medlem sedan sep. 20026 425 inlägg
#8

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

. :(

Medlem sedan juni 200032 967 inlägg
#9

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

Medlem sedan sep. 20026 425 inlägg
#10
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.

Medlem sedan sep. 20026 425 inlägg
#11

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

Medlem sedan sep. 20026 425 inlägg
#12

@nders my man. :f

Medlem sedan nov. 20016 480 inlägg
#13

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?

Medlem sedan nov. 20016 480 inlägg
#14

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

Medlem sedan nov. 20016 480 inlägg
#15

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

Medlem sedan nov. 20016 480 inlägg
#16

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";
  }

}
127 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)