Heim > Datenbank > MySQL-Tutorial > Wie wähle ich Zeilen mit der maximalen DateTime für jedes Zuhause in MySQL aus?

Wie wähle ich Zeilen mit der maximalen DateTime für jedes Zuhause in MySQL aus?

Linda Hamilton
Freigeben: 2025-01-25 06:38:09
Original
285 Leute haben es durchsucht

How to SELECT Rows with the MAX Datetime for Each Home in MySQL?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Diese Abfrage funktioniert wie folgt:

  1. Unterabfrage (groupedtt): Diese innere Abfrage findet das Maximum datetime für jedes home und gruppiert die Ergebnisse nach home.
  2. Join: Die äußere Abfrage verknüpft die Originaltabelle (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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage