Maison > base de données > tutoriel mysql > Comment récupérer l'e-mail le plus récent de chaque expéditeur à l'aide de GROUP BY et ORDER BY de MySQL ?

Comment récupérer l'e-mail le plus récent de chaque expéditeur à l'aide de GROUP BY et ORDER BY de MySQL ?

Mary-Kate Olsen
Libérer: 2025-01-12 13:57:46
original
1026 Les gens l'ont consulté

How to Retrieve the Most Recent Email from Each Sender Using MySQL's GROUP BY and ORDER BY?

Explication détaillée et application des clauses GROUP BY et ORDER BY de MySQL

Lorsque vous travaillez avec des tables de données dans une base de données MySQL, il est crucial de comprendre l'interaction des clauses GROUP BY et ORDER BY. Considérez le scénario suivant :

Vous devez regrouper les lignes du tableau des e-mails par adresse e-mail de l'expéditeur, dans le but de récupérer le dernier e-mail de chaque expéditeur. Cependant, la requête suivante :

<code class="language-sql">SELECT 
    `timestamp`, `fromEmail`, `subject`
FROM `incomingEmails` 
GROUP BY LOWER(`fromEmail`) 
ORDER BY `timestamp` DESC</code>
Copier après la connexion

produira des résultats incorrects. Il regroupe les e-mails par expéditeur, mais peut ne pas afficher les derniers sujets de chaque groupe. Les résultats peuvent afficher :

<code>fromEmail: [email protected], subject: hello
fromEmail: [email protected], subject: welcome</code>
Copier après la connexion

Et les données réelles contiennent :

<code>fromEmail: [email protected], subject: hello
fromEmail: [email protected], subject: programming question
fromEmail: [email protected], subject: welcome</code>
Copier après la connexion

Solution : utilisez la sous-requête et la fonction ANY_VALUE()

Pour résoudre ce problème, vous pouvez utiliser une sous-requête en combinaison avec la fonction ANY_VALUE() :

<code class="language-sql">SELECT * 
FROM ( 
    SELECT `timestamp`, `fromEmail`, ANY_VALUE(`subject`) AS `subject`
    FROM `incomingEmails` 
    ORDER BY `timestamp` DESC
) AS tmp_table 
GROUP BY LOWER(`fromEmail`)</code>
Copier après la connexion

Dans MySQL 5.7 et versions ultérieures, ANY_VALUE() permet l'utilisation de colonnes non agrégées dans une instruction GROUP BY avec une clause SELECT. Il sélectionne de manière aléatoire une valeur dans chaque groupe, garantissant que la sous-requête récupère le sujet le plus récent pour l'adresse e-mail de chaque expéditeur.

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