Felix2: Join Problem

Hallo,

ich habe die Tabellen a und b. Ein Element aus a kann mit beliebig vielen Elementen aus b verknüpft sein und umgekehrt. Daher speichere ich die Zusammenhänge in einer dritten Tabelle c (n zu m Relation).

Nun will ich alle Elemente von Tabelle a ausgeben, und, wenn vorhanden, ein bestimmtes Element aus b, das eine Bedingung erfüllt:

select * from a left join c on a.ID=c.Key where c.Key2=xy or c.Key is null

so erhalte ich aber leider nicht alle Elemente aus a, denn Elemente, die nicht mit c.Key=xy verknüpft sind, sondern mit einem anderen Element aus c, fallen raus.

Kennt hier jemand eine Lösung? (MySql 5.0)

Es grüßt
Felix

  1. Hallo,

    Nun will ich alle Elemente von Tabelle a ausgeben, und, wenn vorhanden, ein bestimmtes Element aus b, das eine Bedingung erfüllt:

    select * from a left join c on a.ID=c.Key where c.Key2=xy or c.Key is null

    Wo ist hier b im Spiel? Nirgendwo. Verstümmele Fragestellungen nicht bis zum Geht-nicht-mehr. Sowas trägt nicht zum Verständnis bei. Beispieltabelle mit je zwei Beispielspalten, ein paar Beispieldatensätzen und dem gewünschten Resultat wäre hilfreich. Außerdem wäre es hilfreich, wenn die Tabellen nicht a, b, c hießen, sondern vernünftige (ihre richtigen) Namen trügen.

    so erhalte ich aber leider nicht alle Elemente aus a, denn Elemente, die nicht mit c.Key=xy verknüpft sind, sondern mit einem anderen Element aus c, fallen raus.

    Ja, genau das sagt Deine Anweisung aus. Du verknüpfst a mit c über die Gleichheitsbedingung der Spalten a.ID und c.Key, wobei Du außerdem noch alle Datensätze aus a haben möchtest, die keine Entsprechung in c haben.

    Die resultierende Ergebnismenge schränkst Du ein, auf die Datensätze, für die es kein Gegenstück zur a.ID in c gibt (c.Key IS NULL) oder für die c.Key2 einen bestimmten Wert hat (wenn es ein Gegenstück gibt).

    Kennt hier jemand eine Lösung? (MySql 5.0)

    Da Du alles aus a ausgeben möchtest und nur in bestimmten Fällen noch Informationen aus c (bzw. b), sieht es so aus, als möchtest Du alle Bedingungen in die Join-Bedingung packen:

    SELECT  
        <spaltenliste>  
    FROM  
        a  
    LEFT JOIN  
        c  
    ON  
        a.ID = c.Key  
    AND  
        c.Key2 = <bestimmter wert>  
    
    

    siehe dazu auch das Beispiel in diesem Archivbeitrag.

    Freundliche Grüße

    Vinzenz