MySQL: Extrahieren des endgültigen Datensatzes aus jeder Gruppe
In diesem Handbuch werden effiziente Methoden zum Abrufen des letzten Datensatzes in jeder Gruppe in einer MySQL -Datenbank untersucht. Wir werden Techniken untersuchen, die für MySQL 8.0 und frühere Versionen geeignet sind.
Mysql 8.0 und Fensterfunktionen:
MySQL 8.0 führte Fensterfunktionen ein und bietet einen optimierten Ansatz. Die folgende Abfrage verwendet ROW_NUMBER()
, um jedem Datensatz in seiner Gruppe einen Rang zuzuweisen, der von der Spalte id
geordnet wurde (unter der Annahme id
ist eine chronologische Reihenfolge):
<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>
Diese Abfrage verteilt sich die Daten nach name
(die Gruppierungsspalte) und weist den letzten Datensatz in jeder Partition zu.
pre-mysql 8.0-Techniken:
Für MySQL -Versionen vor 8.0 sind alternative Strategien erforderlich:
Methode 1: Unterabfrage mit Gruppe nach:
Diese Methode nutzt eine Unterabfrage, um die Daten zu bestellen, und gruppiert dann die Ergebnisse:
<code class="language-sql">SELECT * FROM (SELECT * FROM messages ORDER BY id DESC) AS x GROUP BY name</code>
Methode 2: Linksverbindung mit Nullfilterung:
LEFT JOIN
Dieser Ansatz verwendet ein NULL
, um jeden Datensatz mit anderen in derselben Gruppe zu vergleichen. Aufzeichnungen ohne nachfolgenden Datensatz (angezeigt durch ein
<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>
Leistungsanalyse:
LEFT JOIN
Die Leistung dieser Methoden hängt von der Datengröße und der Datenbankkonfiguration ab. Während die Fensterfunktionen im Allgemeinen effizient sind, übertrifft die GROUP BY
-Methode die LEFT JOIN
-Ebimery häufig, insbesondere für große Datensätze. Benchmark -Tests an wesentlichen Datensätzen (z. B. die Datenbank von Stackoverflow August 2009) haben gezeigt, dass der Ansatz
Schlussfolgerung:
Die Fensterfunktionen von LEFT JOIN
MySQL 8.0 bieten eine elegante und häufig effiziente Lösung. Für ältere MySQL -Versionen bietet die
Das obige ist der detaillierte Inhalt vonWie kann ich den letzten Datensatz in jeder Gruppe in MySQL effizient abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!