web-dev-qa-db-de.com

Wie sortiere ich die Reihenfolge von LEFT JOIN in einer SQL-Abfrage?

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?

40

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;

Weitere Informationen zu 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;
47
a'r
   SELECT
      `userName`,
      `carPrice`
   FROM `users`
   LEFT JOIN (SELECT * FROM `cars` ORDER BY `carPrice`) as `cars`
   ON cars.belongsToUser=users.id
   WHERE `id`='4'
16
vencedor

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'
12
MatBailie

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
7

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

2
Felix Geenen