Schrift
[thread]11982[/thread]

Abfrage einer Baumstruktur in 5 Ebenen...



<< |< 1 2 >| >> 14 Einträge, 2 Seiten
olruebe01
 2008-06-05 20:53
#110791 #110791
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
Hallo,

mir liegt mal wieder ein Stein im Weg.

Ich habe eine Tabelle, die den eBay-Kategoriebaum in bis zu 5 Ebenen enthält.
Manche Kategorien haben nur 2 Ebenen tiefe, andere eben 5.

Die Tabelle arbeitet mit Parent-Ids für jede Unterkategorie und der Parent-id 0 für die oberste Ebene.

Nun meine Frage: Wie kann ich Artikel abfrage, die in allen Unterkategorien einer bestimmten obersten Kategorie liegt?

Beispiel: Ich wähle in der obersten Ebene die Kategorie "Fahrzeuge". Nun möchte ich alle Artikel angezeigt gekommen, die in allen Unter- und Unterunterunter...-Kategorien von "Fahrrzeug" eingetragen sind.

Hier fehlt mir gerade völlig das Verständnis.
Ich kann mir die einzelnen Unterkategorien von "Fahrzeuge" per SQL abrufen über "...where Parent_id = [[ID von Fahrzeuge]]..." aber wie mache ich das über 5 Ebenen hinaus, wenn zu jeder Kategorie jeweils nur die nächsthöhere Ebene als Parent_id eingetragen ist?

Was wäre der richtige Suchbegriff für Goolge für mein Problem???

Danke!!
Oliver
GwenDragon
 2008-06-05 21:10
#110792 #110792
User since
2005-01-17
14600 Artikel
Admin1
[Homepage]
user image
Subselects. Wäre das bei SQL-97 & Co., wenn ich mich erinnere.
olruebe01
 2008-06-05 21:32
#110793 #110793
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
Danke, das sieht auf den ersten Blick ganz gut aus.

Aber wie mache ich das mit 5 Ebenen? Soll ich dann 5 Subselects ineinander verschalchteln? So würde ich das verstehen...
olruebe01
 2008-06-05 21:42
#110794 #110794
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
hmmm... scheint nicht zu klappen.

Offensichtlich darf der subselect nur ein(!) Ergebnis zurückgeben. Dem ist bei mir aber nicht so, da jede einzelne Ebene weitere (mehrere!) Unterordner hat...
Gast Gast
 2008-06-05 22:01
#110795 #110795
Was hast du denn gemacht als SELECT??
Hagen
 2008-06-06 00:07
#110799 #110799
User since
2007-09-06
233 Artikel
BenutzerIn
[default_avatar]
Eine interessante Frage, auf deren Lösung ich auch sehr gespannt bin. Inbesondere ob das mit einer(!) SQL-Anweisung möglich ist.

Als Lösung würde mir nur eine Rekursion einfallen, aber technisch ist das keine so tolle Umsetzung.

Falls du deine Datenstruktur ändern/erweitern darfst, würde ich dir 'Nested Sets' vorschlagen. Das einfügen, verschieben und löschen ist zwar etwas aufwendiger, dafür kann man aber prima Abfrage erstellen. Einfach mal nach Googlen oder bei Wikipedia nachschauen.
Gruß
Hagen
murphy
 2008-06-06 18:54
#110833 #110833
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Hagen+2008-06-05 22:07:01--
Eine interessante Frage, auf deren Lösung ich auch sehr gespannt bin. Inbesondere ob das mit einer(!) SQL-Anweisung möglich ist.

Als Lösung würde mir nur eine Rekursion einfallen, aber technisch ist das keine so tolle Umsetzung.
[...]


Manche Datenbanken haben dafür eine spezielle Syntax (Beispiel: http://philip.greenspun.com/sql/trees.html).

Generell ist es aber oft besser, hierarchische Strukturen in SQL einfach anders zu repräsentieren – zum Beispiel mit Nested Sets
When C++ is your hammer, every problem looks like your thumb.
Hagen
 2008-06-07 12:37
#110840 #110840
User since
2007-09-06
233 Artikel
BenutzerIn
[default_avatar]
murphy+2008-06-06 16:54:16--
Manche Datenbanken haben dafür eine spezielle Syntax (Beispiel: http://philip.greenspun.com/sql/trees.html).


Aber leider eben nur manche :-(

Zu den Nested Sets hatte ich aber auch noch mal vor einiger Zeit eine Alternative gefunden, die zwar einfacher vom Verständnis und der Implementierung ist, aber nicht so "leistungsstark"; mir fällt nur leider der Name nicht mehr ein. Die IDs waren wie folgt aufgebaut:

Bereich1
Bereich1.Titel1
Bereich1.Titel2
Bereich1.Titel2.Überschrift1
Bereich2
Bereich2.Titel1
Bereich2.Titel2.Überschrift1
Bereich2.Titel2.Überschrift2
usw.
Gruß
Hagen
olruebe01
 2008-06-07 13:12
#110844 #110844
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
ich bin gerade unterwegs und habe bis Montag nur GPRS. Werde das ganze also erst ab Dienstag weiter verfolgen und testen können.

Zur Frage, wie mein Befehl aussah:
Eine reine Beispielabfrage
Code: (dl )
1
2
3
4
5
6
7
8
SELECT `parent_cat_id` , `cat_id` , `cat_name` 
FROM ebay_cat_de
WHERE parent_cat_id = (
SELECT `cat_id`
FROM ebay_cat_de
WHERE `parent_cat_id` = 353 )
LIMIT 0 , 30
olruebe01
 2008-06-09 18:22
#110915 #110915
User since
2006-01-19
192 Artikel
BenutzerIn
[default_avatar]
So, habe mit das ganze ein wenig angesehen und die Nested Sets scheinen generell wohl das richtige zu sein. Aber ganz ehrlich: Da steige ich noch nicht ganz durch. Ich habe das Beispiel verstanden aber bei dem Versuch, dies auf 53.000 eBay-Kategorien zu übertragen, erwarte ich doch einige graue Haare...

Ich glaube, ich werde meine Kategorietabelle einfach umstricken und niht nur die Parent-Kategorie eintragen, sonder auch die Grandpa und Urgroßvater. Ich gleube, dass meine Tabelle dann zwar nicht mehr "normalisiert" ist (wenn ich das richtig sehe) aber so kann ich doch für den Moment mein Ziel erreichen.

Ich werde mir die nested Sets aber auf jeden Fall zu gemüte führen, wenn ich mal ein wenig mehr Zeit und ein einfacher nachzuvollziehnedes BEispiel habe, als meine 53.000 Kategorien, bei denen ich die Zusammenhänge teilweise im Klartext nicht nachvollziehen kann... :-)

Erstmal Danke für die Hilfe und die Tipps!!

<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2008-06-05 20:53.