Heim >Datenbank >MySQL-Tutorial >Wie kann ich in MySQL effizient die aktuellste E-Mail pro Absender auswählen?

Wie kann ich in MySQL effizient die aktuellste E-Mail pro Absender auswählen?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-12 14:10:43152Durchsuche

How Can I Efficiently Select the Most Recent Email per Sender in MySQL?

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!

Stellungnahme:
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