Optimisation des requêtes MySQL pour la récupération d'e-mails récents
Les clauses GROUP BY
et ORDER BY
de MySQL sont des outils puissants pour l'organisation des données, mais la sélection efficace de l'e-mail le plus récent par expéditeur nécessite un examen attentif. Une approche naïve pourrait donner des résultats incorrects.
Par exemple, cette requête tente de regrouper les e-mails par expéditeur et de les trier par horodatage :
<code class="language-sql">SELECT `timestamp`, `fromEmail`, `subject` FROM `incomingEmails` GROUP BY LOWER(`fromEmail`) ORDER BY `timestamp` DESC</code>
Le problème est que les timestamp
et subject
renvoyés peuvent ne pas refléter l'e-mail le plus récent de chaque expéditeur.
Une solution plus robuste implique une sous-requête pour trier d'abord les données par horodatage, puis les regrouper par expéditeur :
<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 crée une table temporaire (tmp_table
) classée par horodatage, garantissant que l'opération de regroupement sélectionne l'e-mail le plus récent par expéditeur.
Cependant, cette méthode repose sur le comportement de MySQL consistant à sélectionner des valeurs arbitraires pour les colonnes non agrégées dans une clause GROUP BY
. Il s'agit d'un SQL non standard et peut conduire à des résultats imprévisibles. MySQL 5.7.5 a introduit ONLY_FULL_GROUP_BY
par défaut, ce qui rend cette approche problématique.
Pour résoudre ce problème, nous pouvons utiliser ANY_VALUE()
(introduit dans MySQL 5.7), qui permet explicitement de sélectionner n'importe quelle valeur du groupe pour les colonnes non agrégées :
<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>
Cette requête fournit un moyen plus fiable et conforme aux normes de récupérer l'e-mail le plus récent de chaque expéditeur dans votre base de données MySQL.
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!