Suche Mysql-Query

MarkusH

Aktives Mitglied
Hallo,

ich suche eine Mysqlquery:
Alle Einträge aus Tabelle A werden angezeigt die passenden Einträge aus Tabelle B
beispiel:

A
-------------
|id|name|
|1 |Test1|
|2 |Test2|
|3 |Test3|
-------------

B:
-------------
|id|fid|RES|
|1 |1|ERG1|
|2 |3|ERG2|
-------------

fid ist der Fremschlüssel zu Tabelle A

Das Ergebnis soll sein:

-----------------
|id|name|RES|
|1 |Test1|ERG1|
|2 |Test2|NULL|
|3 |Test3|ERG2|
------------------

Ich habs mit einem einfachen Left Join probiert, das klappt aber leider nicht.

Grüeß und danke im Vorraus
 
QUOTE (MarkusH @ Fr 7.03.2008, 15:03)Ich habs mit einem einfachen Left Join probiert, das klappt aber leider nicht.

Dann poste mal, was Du gemacht hast.

Ein 'einfacher LeftJoin' ist eigentlich genau das Richtige dafür.
 
Hi,

wie so oft, saß ich ne halbe Stunde daran und habe es nicht gebacken bekommen. Kaum habe ich die Frage formuliert und gepostet, fiel mir die Lösung ein.

Die Crux war eine Where-Clause, die sich auf die "rechte" Tabelle bezog, dadurch konnten natürlich keine entsprechenden Datensätze gefunden werden, da es keinen Datensatz rechts gab, mit dem man links joinen konnte. Ich habe nun einfach den entsprechenden Teil in die ON-Bedingung verlagert (ON a.id=f.id AND RES='ERG3') nun klappts.

Danke trotzdem für Eure Hilfe.

Grüße
markus
 
QUOTE (MarkusH @ Fr 7.03.2008, 19:37)Die Crux war eine Where-Clause, die sich auf die "rechte" Tabelle bezog, dadurch konnten natürlich keine entsprechenden Datensätze gefunden werden, da es keinen Datensatz rechts gab, mit dem man links joinen konnte. Ich habe nun einfach den entsprechenden Teil in die ON-Bedingung verlagert (ON a.id=f.id AND RES='ERG3') nun klappts.

Die Lösung ist korrekt. Aber die Begründung ist an einer (für den Umgang mit Sql entscheidenden) Stelle falsch.

Wenn Du


CODE Select A.*
From Tabelle1 As A Left Join Tabelle2 As B
On A.Id = B.fId
Where B.RES = 'ERG3'


verwendest, dann wird für die Zeilen mit B.RES = Null die Where-Klausel immer auch Null, also falsch. Damit fliegen alle typischen LeftJoin-Ergebnisse, bei denen die linke Tabelle eine Zeile und die rechte Tabelle nichts liefert, raus - faktisch entspricht das einem InnerJoin, bei dem B.RES = 'ERG3' und B.fId mit einer passenden ID belegt sein muß, die Zeile also existieren muß.

Nutzt Du stattdessen


CODE Select A.*
From Tabelle1 As A Left Join Tabelle2 As B
On A.Id = B.fId And B.RES = 'ERG3'


dann können für eine Zeile der linken Tabelle beide Bedingungen wegen einem fehlenden rechten Datensatz als Null ausgewertet werden - und die Zeile wird ausgegeben.

Man kann das Problem in manchen Fällen auch über eine Unterabfrage lösen:


CODE Select A.*
From Tabelle1 As A Left Join
(Select B.fId
From Tabelle2 As B
Where B.RES = 'ERG3') As C
On A.Id = C.fId


Da zieht man die Bedingung in die Unterabfrage rein, diese liefert nur die passenden Zeilen zurück - und für alle 'fehlenden Zeilen' liefert die linke Tabelle eine Zeile.
 
Zurück
Oben