Maison > base de données > tutoriel mysql > Comment puis-je sélectionner efficacement l'e-mail le plus récent par expéditeur dans MySQL ?

Comment puis-je sélectionner efficacement l'e-mail le plus récent par expéditeur dans MySQL ?

Patricia Arquette
Libérer: 2025-01-12 14:10:43
original
147 Les gens l'ont consulté

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

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal