MySQL ruft effizient den letzten Datensatz jeder Gruppe ab
In SQL kann es schwierig sein, den neuesten Datensatz für jede Gruppe zu extrahieren. Ein häufiges Szenario ist: Es gibt mehrere Datensätze in der Tabelle, die denselben Primärschlüssel verwenden, und der neueste Eintrag für jeden Primärschlüssel muss extrahiert werden. Dieser Artikel bietet eine effiziente und optimierte Lösung.
Problembeschreibung
Bedenken Sie die folgende messages
Tabelle:
Id | Name | Other_Columns |
---|---|---|
1 | A | A_data_1 |
2 | A | A_data_2 |
3 | A | A_data_3 |
4 | B | B_data_1 |
5 | B | B_data_2 |
6 | C | C_data_1 |
Eine einfache Gruppenabfrage mit SELECT * FROM messages GROUP BY Name
liefert die folgenden Ergebnisse:
Id | Name | Other_Columns |
---|---|---|
1 | A | A_data_1 |
4 | B | B_data_1 |
6 | C | C_data_1 |
Die gewünschte Ausgabe ist jedoch der neueste Datensatz für jede Gruppe:
Id | Name | Other_Columns |
---|---|---|
3 | A | A_data_3 |
5 | B | B_data_2 |
6 | C | C_data_1 |
Lösung
Fensterfunktionen verwenden (MySQL 8.0 und höher)
MySQL 8.0 führte Fensterfunktionen ein, die eine elegante Lösung zum Auffinden des letzten Datensatzes jeder Gruppe bieten. Die folgende Abfrage nutzt die Funktion ROW_NUMBER()
, um dies zu erreichen:
<code class="language-sql">WITH ranked_messages AS ( SELECT m.*, ROW_NUMBER() OVER (PARTITION BY name ORDER BY id DESC) AS rn FROM messages AS m ) SELECT * FROM ranked_messages WHERE rn = 1;</code>
Verwenden Sie LEFT JOIN (frühe Version von MySQL)
Vor MySQL 8.0 war die effizienteste Lösung die Verwendung von LEFT JOIN
:
<code class="language-sql">SELECT m1.* FROM messages m1 LEFT JOIN messages m2 ON (m1.name = m2.name AND m1.id < m2.id) WHERE m2.id IS NULL;</code>
Leistung und Anwendbarkeit
Obwohl beide Lösungen effizient sind, kann ihre Leistung je nach Größe und Verteilung der Daten variieren. Für große und vielfältige Datensätze wird häufig der Fensterfunktionsansatz empfohlen.
Wenn die Daten ein bestimmtes Muster aufweisen (z. B. relativ wenige Datensätze pro Gruppierung), ist der LEFT JOIN
-Ansatz möglicherweise effizienter.
Benchmark
Der LEFT JOIN
-Ansatz hat sich in vielen Fällen als überlegen gegenüber Gruppierungstechniken erwiesen. In einer großen Datenbank mit Millionen von Zeilen dauert die Ausführung der LEFT JOIN
-Methode beispielsweise weniger als eine Sekunde, während die Gruppierungstechnik mehr als eine Minute benötigt.
Es wird jedoch immer empfohlen, beide Lösungen anhand Ihres spezifischen Datensatzes zu testen, um den besten Ansatz zu ermitteln.
Das obige ist der detaillierte Inhalt vonWie finde ich effizient den letzten Datensatz in jeder Gruppe in MySQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!