OK, ich habe versucht, nach einer verrückten Antwort zu suchen, aber das konnte ich nicht lösen, also hoffe ich, dass jemand helfen kann.
Angenommen, ich habe eine Tabelle mit Benutzern, eine sehr einfache Tabelle:
id | userName
3 Michael
4 Mike
5 George
und ich habe eine andere Tabelle ihrer Autos und ihrer Preise.
id | belongsToUser | carPrice
1 4 5000
2 4 6000
3 4 8000
Jetzt muss ich etwas in der Art tun (zögern Sie nicht umzuschreiben):
SELECT
`userName`,
`carPrice`
FROM `users`
LEFT JOIN `cars`
ON cars.belongsToUser=users.id
WHERE `id`='4'
Welches gibt zurück:
Mike | 5000
Aber ich brauche das teuerste Auto eines bestimmten Benutzers, nicht den ersten gefundenen Eintrag.
Frage: Wie stelle ich die LEFT JOIN-Tabelle so ein, dass sie von carPrice, DESC bestellt wird?
Versuchen Sie es mit MAX
mit einem GROUP BY
.
SELECT u.userName, MAX(c.carPrice)
FROM users u
LEFT JOIN cars c ON u.id = c.belongsToUser
WHERE u.id = 4;
GROUP BY u.userName;
GROUP BY
Die group by-Klausel wird verwendet, um die ausgewählten Datensätze basierend auf eindeutigen Gruppenkombinationen nach Spalten in Gruppen aufzuteilen. Auf diese Weise können wir Aggregatfunktionen (z. B. MAX, MIN, SUM, AVG, ...) verwenden, die der Reihe nach auf jede Gruppe von Datensätzen angewendet werden. Die Datenbank gibt für jede Gruppierung einen einzelnen Ergebnisdatensatz zurück.
Wenn wir beispielsweise eine Reihe von Aufzeichnungen haben, die Temperaturen über Zeit und Ort in einer Tabelle wie der folgenden darstellen:
Location Time Temperature
-------- ---- -----------
London 12:00 10.0
Bristol 12:00 12.0
Glasgow 12:00 5.0
London 13:00 14.0
Bristol 13:00 13.0
Glasgow 13:00 7.0
...
Wenn wir dann die maximale Temperatur nach Standort ermitteln möchten, müssen wir die Temperaturdatensätze in Gruppierungen aufteilen, wobei jeder Datensatz in einer bestimmten Gruppe denselben Standort hat. Wir wollen dann die maximale Temperatur jeder Gruppe finden. Die Abfrage dazu wäre wie folgt:
SELECT Location, MAX(Temperature)
FROM Temperatures
GROUP BY Location;
SELECT
`userName`,
`carPrice`
FROM `users`
LEFT JOIN (SELECT * FROM `cars` ORDER BY `carPrice`) as `cars`
ON cars.belongsToUser=users.id
WHERE `id`='4'
Mehrere andere Antworten geben die Lösung mit MAX. In einigen Szenarien ist die Verwendung einer Gesamtfunktion entweder nicht möglich oder nicht performant.
Die Alternative, die ich häufig benutze, ist die Verwendung einer korrelierten Unterabfrage im Join ...
SELECT
`userName`,
`carPrice`
FROM `users`
LEFT JOIN `cars`
ON cars.id = (
SELECT id FROM `cars` WHERE BelongsToUser = users.id ORDER BY carPrice DESC LIMIT 1
)
WHERE `id`='4'
Dadurch erhalten Sie das teuerste Auto für den Benutzer:
SELECT users.userName, MAX(cars.carPrice)
FROM users
LEFT JOIN cars ON cars.belongsToUser=users.id
WHERE users.id=4
GROUP BY users.userName
Diese Aussage lässt mich jedoch denken, dass Sie alle Autopreise in absteigender Reihenfolge sortieren möchten:
Frage: Wie stelle ich die LEFT JOIN-Tabelle so ein, dass sie von carPrice, DESC bestellt wird?
Also kannst du das versuchen:
SELECT users.userName, cars.carPrice
FROM users
LEFT JOIN cars ON cars.belongsToUser=users.id
WHERE users.id=4
GROUP BY users.userName
ORDER BY users.userName ASC, cars.carPrice DESC
probier das mal aus:
SELECT
`userName`,
`carPrice`
FROM `users`
LEFT JOIN `cars`
ON cars.belongsToUser=users.id
WHERE `id`='4'
ORDER BY `carPrice` DESC
LIMIT 1
Felix