Heim > Datenbank > MySQL-Tutorial > Wie finde ich effizient den letzten Datensatz in jeder Gruppe in MySQL?

Wie finde ich effizient den letzten Datensatz in jeder Gruppe in MySQL?

Patricia Arquette
Freigeben: 2025-01-25 19:32:11
Original
295 Leute haben es durchsucht

How to Efficiently Find the Last Record in Each Group in MySQL?

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

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

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!

Quelle:php.cn
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