Andreas Gueso: m:n-Abfrage (kompliziert)

Hallo,

ich stehe vor einem für mich unlösbaren Problem:

Ich habe 3 Tabellen:

Artikel:
id | Titel | Text | Autor

Kategorien:
id | Titel | Beschreibung

Artikel_Kategorien
Artikel_id | Kategorie_id

Nun möchte ich alle Artikel haben:

SELECT * FROM Artikel

Kein Problem soweit

Nun möchte ich alle Artikel zu einer bestimmten Kategorie_id haben. Also  eine Liste aller Artikel in der Kategorie mit der ID 1

Ich hatte an so etwas gedacht wie

SELECT * FROM Artikel WHERE Artikel.id IN (SELECT Artikel_id FROM Artikel_Kategorien WHERE Artikel_Kategorien.Kategorie_id=1)

Leider funktioniert das genauso wenig wie:

SELECT * FROM Artikel WHERE Artikel.id IN (SELECT Artikel_id FROM Artikel_Kategorien WHERE Artikel_Kategorien.Kategorie_id=1 AND Artikel_Kategorien.Artikel_id=Artikel.id)

Wenn kein Artikel in der Kategorie 1 enthalten ist, bekomme ich korrekter weise ein leeres Result. Ist ein Artikel in Kategorie 1, so funktioniert das oben genannte prächtig. Sobald aber mehr als ein Artikel in der abgefragten Kategorie ist, liefert mir das Result immer nur den ersten Artikel.

Kann mir da vielleicht jemand helfen?

Liebe Grüße
Andy

  1. yo,

    das problem läßt sich auf viele weise lösen, aber ich würde zwei ganz einfache joins benutzen.

    SELECT a.id, a.titel, k.titel....
    FROM artikel a
    INNER JOIN artikel_Kategorien ak ON ak.artikel_id = a.id
    INNER JOIN kategorien k ON k.id = k.kategorie_id
    WHERE k.id = 1
    ;

    Ilja

    1. Hallo Ilja,

      das problem läßt sich auf viele weise lösen, aber ich würde zwei ganz einfache joins benutzen.

      SELECT a.id, a.titel, k.titel....
      FROM artikel a
      INNER JOIN artikel_Kategorien ak ON ak.artikel_id = a.id
      INNER JOIN kategorien k ON k.id = k.kategorie_id
      WHERE k.id = 1
      ;

      und da der OP offensichtlich von Joins noch nichts weiß, möchte ich diesem
      unsere Join-Artikel empfehlen:

      Einführung in Joins
      Fortgeschrittene Jointechniken

      Freundliche Grüße

      Vinzenz