Melvin Cowznofski: Liste mit Kategorien und Unterkategorien (2. Lösungsidee)

Beitrag lesen

Hallo dedlfix!

Join ist richtig, genauer ein Self-Join, wenn es nur noch eine Kategorien-Tabelle ist. Die (sagt mein Sprachgefühl (wegen „Abfrage“)) Query sieht da ungefähr so aus:

SELECT c.id category_id, c.name category_name, s.id subcategory_id, s.name subcategory_name
FROM categories s
JOIN categories c ON c.id = s.parent_id
WHERE s.id = ?

  
Ich werfe das Handtuch! Ich bin gestern und heute jetzt sicher schon mehr als 5 Stunden vor dem PC gesessen und habe versucht, eine funktionierende QUERY zu erstellen. Was immer ich auch tue ... es liefert entweder eine Fehlermeldung oder eine Ausgabe mit null Resultaten. Ich bin am Ende mit meinem Latein und hab in der Zwischenzeit ehrlich gesagt auch keinen Freude mehr daran.  
  
  
  
Das ist die Ausgangslage:  
=========================  
  
  
Auszug aus der Tabelle "categories":  
  
id | name     | parent\_id  
\-------------------------  
1  | Politik  | 0  
3  | Parteien | 1  
  
Auszug aus der Tabelle "links":  
  
id | category\_id | name          | url  
\-------------------------------------------------------------------  
12 | 3           | Zwergenpartei | http://example.com/zwergenpartei  
  
  
  
Das ist das Ziel / so soll die Ausgabe sein:  
============================================  
  
  
Kategorie | Unterkategorie | Name          | URL  
\-----------------------------------------------------------------------------  
Politik   | Parteien       | Zwergenpartei | http://example.com/zwergenpartei  
  
  
  
Meine bisherigen Schritte:  
==========================  
  
  
Versuch 1 ~ Die Ausgabe der Links ohne Bezug zu einer Kategorie:  
  
~~~sql
SELECT l.name AS Name, l.url AS URL  
FROM links AS l  
ORDER BY l.id ASC

Das funktioniert natürlich und liefert das gewünschte Ergebnis.

Versuch 2 ~ Die Ausgabe der Links incl. der dazugehörenden Kategorie ID:

SELECT l.name AS Name, l.url AS URL, l.category_id AS Kategorie_ID  
FROM links AS l  
ORDER BY l.id ASC  

Noch immer kein Join, noch immer kein Problem.

Versuch 3 ~ Die Ausgabe der Links samt dem Unterkategorienamen:

SELECT l.name AS Name, l.url AS URL, c.name AS Unterkategorie  
FROM links AS l  
INNER JOIN categories AS c ON c.id = l.category_id  
ORDER BY l.id ASC

Das funktioniert auch noch und liefert das gewünschte Ergebnis.

Aber an diesem Punkt stehe ich jetzt vor einer Wand. Wie erweitere ich die Query jetzt in Folge, um neben der Unterkategorie auch die Kategorie stehen zu haben? Mir ist klar, dass irgendwo im JOIN jetzt die Spalte 'parent_id' auftauchen muss. Nur wo und wie??

Nachdem der Name der Kategorie ja aus der selben Spalte kommt wie der Name der Unterkategorie, muss der Anfang sohl so lauten:

SELECT l.name AS Name, l.url AS URL, c.name AS Unterkategorie, c2.name AS Kategorie  
FROM links AS l  
INNER JOIN categories AS c ON c.id = l.category_id  
INNER JOIN categories AS c1  
ORDER BY l.id ASC

So ungefähr, oder? Wenn ich das mit den Joins richtig verstanden habe, dann muss ich beim Alisnamen für den 2. Join ja einen anderen nehmen als für den ersten. Deshalb ist die Tabelle 'categories' im ersten Join das "c" und im zweiten Join das "c1".

Und jetzt bin ich mit meinem Latein am Ende. Egal, was ich jetzt womit auch kombiniere - die Ausgabe ist entweder leer oder es kommt eine Fehlrmeldung. Deshalb ist "Wie geht das jetzt" leider schon die spezifischste Fragenstellung, die ich momentan anbieten kann. =/

Mit lieben Grüßen

Melvin Cowznofski

--

Melvin Cowznofski
What – me worry?