Vinzenz Mai: JOIN falls Verknüpfung vorhanden

Beitrag lesen

Hallo Oli,

hier korrigiertes funktionierendes SQL-Statement:

Tab user

ID User
1  Anna
2  Bernd
3 Chis

Tab Bilder
id_user bild_name sort

1  anna1.jpg 1
1  anna2.jpg 2
2  bernd.jpg 1

1. Schritt:
Zeige mir alle User an, dazu die Bildnamen, sofern welche existieren

  
SELECT  
    user.user,  
    b1.bild_name  
FROM user  
LEFT JOIN bilder b1      -- LEFT JOIN, damit auch die User angezeigt werden,  
                         -- für die kein Bildeintrag existiert  
                         -- b1 ist ein Aliasname für den Tabellennamen bilder  
                         -- Wir greifen später ein zweites Mal auf die Tabelle zu.  
ON user.id = b1.id_user  -- JOIN-Bedingung  

Ergebnis:

user    bild_name
-----------------------------------
Anna    anna1.jpg
Anna    anna2.jpg
Bernd   bernd.jpg
Chris   NULL

2.Schritt:
Schränke die Ausgabe auf das Bild ein, das in der Spalte sort den kleinsten Wert aufweist.

  
SELECT  
    user.user,  
    b1.bild_name  
FROM user  
LEFT JOIN bilder b1      -- LEFT JOIN, damit auch die User angezeigt werden,  
                         -- für die kein Bildeintrag existiert  
                         -- b1 ist ein Aliasname für den Tabellennamen bilder  
                         -- Wir greifen später ein zweites Mal auf die Tabelle zu.  
ON user.id = b1.id_user  -- JOIN-Bedingung  
WHERE b1.sort = (  
    SELECT MIN(b2.sort)  -- Nur die Datensätze mit dem kleinsten sort-Wert  
    FROM bilder b2  
    WHERE b2.id_user = b1.id_user)  -- bei gleichem user (id_user)  

Das Ergebnis

user    bild_name
-----------------------------------
Anna    anna1.jpg
Bernd   bernd.jpg

kann noch nicht zufrieden stellen. Zwar wird wie gewünscht bei Anna nur das Bild mit dem kleinsten sort-Wert angezeigt, dafür ist der Eintrag von Chris verlorengegangen. Dies liegt daran, dass für Chris in der Spalte b1.sort der Wert NULL steht. Diesen Datensatz (und vergleichbare) müssen wir gesondert betrachten. Den Vergleich mit NULL-Werten führt man mit IS NULL durch.

Schritt 3:

  
SELECT  
    user.user,  
    b1.bild_name  
FROM user  
LEFT JOIN bilder b1      -- LEFT JOIN, damit auch die User angezeigt werden,  
                         -- für die kein Bildeintrag existiert  
                         -- b1 ist ein Aliasname für den Tabellennamen bilder  
                         -- Wir greifen später ein zweites Mal auf die Tabelle zu.  
ON user.id = b1.id_user  -- JOIN-Bedingung  
WHERE b1.sort = (  
    SELECT MIN(b2.sort)  
    FROM bilder b2  
    WHERE b2.id_user = b1.id_user)  
    OR b1.sort IS NULL   -- damit auch die User ohne Bild berücksichtigt werden.  

liefert das gewünschte Ergebnis

user    bild_name
-----------------------------------
Anna    anna1.jpg
Bernd   bernd.jpg
Chris   NULL

Freundliche Grüße

Vinzenz