Heim >Datenbank >MySQL-Tutorial >Wie kann ich in MySQL effizient die aktuellste E-Mail pro Absender auswählen?
MySQL-Abfragen für den Abruf aktueller E-Mails optimieren
Die GROUP BY
- und ORDER BY
-Klauseln von MySQL sind leistungsstarke Werkzeuge für die Datenorganisation, aber die effiziente Auswahl der neuesten E-Mail pro Absender erfordert sorgfältige Überlegungen. Ein naiver Ansatz könnte zu falschen Ergebnissen führen.
Bei dieser Abfrage wird beispielsweise versucht, E-Mails nach Absender zu gruppieren und nach Zeitstempel zu ordnen:
<code class="language-sql">SELECT `timestamp`, `fromEmail`, `subject` FROM `incomingEmails` GROUP BY LOWER(`fromEmail`) ORDER BY `timestamp` DESC</code>
Das Problem besteht darin, dass die zurückgegebenen timestamp
und subject
möglicherweise nicht die neueste E-Mail für jeden Absender widerspiegeln.
Eine robustere Lösung beinhaltet eine Unterabfrage, um die Daten zunächst nach Zeitstempel zu ordnen und dann nach Absender zu gruppieren:
<code class="language-sql">SELECT * FROM ( SELECT `timestamp`, `fromEmail`, `subject` FROM `incomingEmails` ORDER BY `timestamp` DESC ) AS tmp_table GROUP BY LOWER(`fromEmail`)</code>
Dadurch wird eine temporäre Tabelle (tmp_table
) erstellt, die nach Zeitstempel geordnet ist und sicherstellt, dass der Gruppierungsvorgang die neueste E-Mail pro Absender auswählt.
Diese Methode basiert jedoch auf dem Verhalten von MySQL, beliebige Werte für nicht aggregierte Spalten in einer GROUP BY
-Klausel auszuwählen. Dies ist kein Standard-SQL und kann zu unvorhersehbaren Ergebnissen führen. MySQL 5.7.5 hat ONLY_FULL_GROUP_BY
standardmäßig eingeführt, was diesen Ansatz problematisch macht.
Um dieses Problem zu beheben, können wir ANY_VALUE()
(eingeführt in MySQL 5.7) verwenden, das explizit die Auswahl eines beliebigen Werts aus der Gruppe für nicht aggregierte Spalten ermöglicht:
<code class="language-sql">SELECT ANY_VALUE(`timestamp`) AS recent_timestamp, ANY_VALUE(`fromEmail`) AS sender_email, ANY_VALUE(`subject`) AS subject FROM `incomingEmails` GROUP BY LOWER(`fromEmail`) ORDER BY recent_timestamp DESC</code>
Diese Abfrage bietet eine zuverlässigere und standardkonforme Möglichkeit, die neueste E-Mail für jeden Absender in Ihrer MySQL-Datenbank abzurufen.
Das obige ist der detaillierte Inhalt vonWie kann ich in MySQL effizient die aktuellste E-Mail pro Absender auswählen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!