MySQL: Auswählen von Zeilen mit der maximalen Datumszeit für jede Gruppe
Diese Anleitung zeigt, wie Sie effizient Zeilen abrufen, die den maximalen Datum/Uhrzeit-Wert für jede einzelne Gruppe in einer MySQL-Tabelle enthalten. Dies ist eine häufige SQL-Herausforderung, bei der es häufig um Unterabfragen oder Fensterfunktionen geht.
Szenario:
Stellen Sie sich eine Tabelle vor (TopTen
), die die Ressourcennutzung der Spieler in verschiedenen Häusern verfolgt:
<code class="language-sql">CREATE TABLE TopTen ( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, home INT UNSIGNED NOT NULL, datetime DATETIME NOT NULL, player VARCHAR(6) NOT NULL, resource INT NOT NULL );</code>
Ziel ist es, für jeden home
den Datensatz mit dem neuesten (datetime
) Eintrag zu finden, einschließlich der player
- und resource
-Informationen aus diesem neuesten Datensatz.
Ineffiziente Ansätze (und warum sie scheitern):
Einfaches GROUP BY
und MAX()
funktionieren nicht direkt, da GROUP BY
die Daten aggregiert und die nicht aggregierten Spalten wie player
verloren gehen. Versuche, Unterabfragen zu verwenden, um die maximale Datums- und Uhrzeitangabe für jedes Haus zu ermitteln und dann wieder mit der ursprünglichen Tabelle zu verknüpfen, führen häufig zu falschen oder unvollständigen Ergebnissen.
Die effektive Lösung:
Die effizienteste Lösung nutzt einen Self-Join mit einer Unterabfrage:
<code class="language-sql">SELECT tt.* FROM TopTen tt INNER JOIN ( SELECT home, MAX(datetime) AS MaxDateTime FROM TopTen GROUP BY home ) groupedtt ON tt.home = groupedtt.home AND tt.datetime = groupedtt.MaxDateTime;</code>
Diese Abfrage funktioniert wie folgt:
groupedtt
): Diese innere Abfrage findet das Maximum datetime
für jedes home
und gruppiert die Ergebnisse nach home
.TopTen
mit dem Alias tt
) mit den Ergebnissen der Unterabfrage. Die JOIN
-Bedingung stellt sicher, dass nur Zeilen, die sowohl mit home
als auch mit dem Maximum datetime
übereinstimmen, in das Endergebnis einbezogen werden.Diese Methode stellt sicher, dass alle Spalten aus der Originaltabelle (einschließlich player
und resource
) für die Zeile zurückgegeben werden, die das Maximum datetime
für jedes home
darstellt. Dies vermeidet Datenverlust und stellt die vollständigen erforderlichen Informationen bereit.
Das obige ist der detaillierte Inhalt vonWie wähle ich Zeilen mit der maximalen DateTime für jedes Zuhause in MySQL aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!