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