Heim >Datenbank >MySQL-Tutorial >Wie kann man E-Mails zuverlässig nach Absender gruppieren und den neuesten Betreff und Zeitstempel in MySQL abrufen?
MySQL-E-Mail-Gruppierung: Sicherstellen eines genauen aktuellen Betreffs und Zeitstempels
Das Abrufen und Gruppieren von E-Mail-Daten nach Absender in MySQL erfordert sorgfältige Überlegungen, um sicherzustellen, dass Betreff und Zeitstempel die aktuellste E-Mail widerspiegeln. Standardmäßige GROUP BY
- und ORDER BY
-Klauseln allein können zu inkonsistenten Ergebnissen führen.
Probleme mit grundlegenden GROUP BY
Abfragen
Ein gängiger, aber fehlerhafter Ansatz ist:
<code class="language-sql">SELECT `timestamp`, `fromEmail`, `subject` FROM `incomingEmails` GROUP BY LOWER(`fromEmail`) ORDER BY `timestamp` DESC</code>
Diese Abfrage versucht, nach Absender zu gruppieren, aber die ausgewählten subject
und timestamp
sind nicht immer die neuesten.
Die Unterabfragelösung
Eine zuverlässigere Methode beinhaltet eine Unterabfrage, um die Reihenfolge vor der Gruppierung zu priorisieren:
<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 die Reihenfolge der Vorgänge umgekehrt. Die innere Abfrage sortiert nach Zeitstempel und die äußere Abfrage gruppiert nach Absender, um sicherzustellen, dass die Daten der aktuellsten E-Mail ausgewählt werden.
Wichtige Überlegungen und MySQL 5.7-Kompatibilität
Die Verwendung nicht aggregierter Spalten in der SELECT
-Liste mit GROUP BY
ist ein nicht standardmäßiges SQL-Verhalten. Der Umgang von MySQL damit kann unvorhersehbar sein und gibt häufig Werte aus einer beliebigen Zeile innerhalb jeder Gruppe zurück.
Seit MySQL 5.7.5 ist ONLY_FULL_GROUP_BY
die Standardeinstellung, was zu Fehlern führt, wenn nicht aggregierte Spalten ohne ordnungsgemäße Aggregationsfunktionen einbezogen werden.
Best Practice für MySQL 5.7 und höher
Für optimale Kompatibilität und Klarheit, insbesondere in MySQL 5.7 und späteren Versionen, verwenden Sie ANY_VALUE()
:
<code class="language-sql">SELECT `timestamp`, `fromEmail`, ANY_VALUE(`subject`) AS `subject` FROM `incomingEmails` GROUP BY LOWER(`fromEmail`) ORDER BY `timestamp` DESC</code>
Dies besagt ausdrücklich, dass jeder Wert aus der Spalte subject
für jede Gruppe akzeptabel ist, um sicherzustellen, dass die Abfrage korrekt funktioniert und Mehrdeutigkeiten vermieden werden. Der aktuellste Zeitstempel wird aufgrund der ORDER BY
-Klausel beibehalten.
Das obige ist der detaillierte Inhalt vonWie kann man E-Mails zuverlässig nach Absender gruppieren und den neuesten Betreff und Zeitstempel in MySQL abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!