Regroupement d'e-mails MySQL : garantir un objet et un horodatage récents précis
La récupération et le regroupement des données d'e-mail par expéditeur dans MySQL nécessitent un examen attentif pour garantir que l'objet et l'horodatage reflètent l'e-mail le plus récent. Les clauses standards GROUP BY
et ORDER BY
seules peuvent produire des résultats incohérents.
Problèmes avec les GROUP BY
requêtes de base
Une approche courante, mais imparfaite, est :
<code class="language-sql">SELECT `timestamp`, `fromEmail`, `subject` FROM `incomingEmails` GROUP BY LOWER(`fromEmail`) ORDER BY `timestamp` DESC</code>
Cette requête tente de regrouper par expéditeur, mais les subject
et timestamp
sélectionnés ne sont pas systématiquement les plus récents.
La solution de sous-requête
Une méthode plus fiable implique une sous-requête pour prioriser le classement avant le regroupement :
<code class="language-sql">SELECT * FROM ( SELECT `timestamp`, `fromEmail`, `subject` FROM `incomingEmails` ORDER BY `timestamp` DESC ) AS tmp_table GROUP BY LOWER(`fromEmail`)</code>
Cela inverse l’ordre des opérations. La requête interne trie par horodatage et la requête externe regroupe par expéditeur, garantissant ainsi la sélection des données de l'e-mail le plus récent.
Considérations importantes et compatibilité MySQL 5.7
L'utilisation de colonnes non agrégées dans la liste SELECT
avec GROUP BY
est un comportement SQL non standard. La gestion de cela par MySQL peut être imprévisible, renvoyant souvent des valeurs à partir d'une ligne arbitraire au sein de chaque groupe.
Depuis MySQL 5.7.5, ONLY_FULL_GROUP_BY
est la valeur par défaut, ce qui entraîne des erreurs si des colonnes non agrégées sont incluses sans fonctions d'agrégation appropriées.
Meilleures pratiques pour MySQL 5.7 et versions ultérieures
Pour une compatibilité et une clarté optimales, en particulier dans MySQL 5.7 et versions ultérieures, utilisez 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>
Cela indique explicitement que toute valeur de la colonne subject
est acceptable pour chaque groupe, garantissant que la requête fonctionne correctement et évite toute ambiguïté. L'horodatage le plus récent sera conservé en raison de la clause ORDER BY
.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!