Maison > base de données > tutoriel mysql > Comment regrouper de manière fiable les e-mails par expéditeur et récupérer le sujet et l'horodatage les plus récents dans MySQL ?

Comment regrouper de manière fiable les e-mails par expéditeur et récupérer le sujet et l'horodatage les plus récents dans MySQL ?

Barbara Streisand
Libérer: 2025-01-12 14:01:43
original
644 Les gens l'ont consulté

How to reliably group emails by sender and retrieve the most recent subject and timestamp in MySQL?

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

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

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

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!

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