ホームページ >データベース >mysql チュートリアル >MySQL で電子メールを送信者ごとに確実にグループ化し、最新の件名とタイムスタンプを取得するにはどうすればよいでしょうか?

MySQL で電子メールを送信者ごとに確実にグループ化し、最新の件名とタイムスタンプを取得するにはどうすればよいでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-12 14:01:43648ブラウズ

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

MySQL 電子メールのグループ化: 最近の件名とタイムスタンプが正確であることを確認する

MySQL で送信者ごとに電子メール データを取得してグループ化するには、件名とタイムスタンプが最新の電子メールを反映していることを保証するために慎重な考慮が必要です。 標準の GROUP BY 句と ORDER BY 句だけでは、一貫性のない結果が生成される可能性があります。

基本的な GROUP BY クエリの問題

一般的ではありますが、欠陥のあるアプローチは次のとおりです。

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

このクエリは送信者ごとにグループ化しようとしていますが、選択された subjecttimestamp は常に最新のものではありません。

サブクエリ ソリューション

より信頼性の高い方法には、グループ化する前に順序付けに優先順位を付けるサブクエリが含まれます。

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

これにより、操作の順序が逆になります。 内部クエリはタイムスタンプで並べ替えられ、外部クエリは送信者ごとにグループ化され、最新の電子メール データが確実に選択されます。

重要な考慮事項と MySQL 5.7 の互換性

SELECT リスト内の非集計列を GROUP BY とともに使用することは、非標準の SQL 動作です。 MySQL によるこれの処理は予測できない場合があり、多くの場合、各グループ内の任意の行から値が返されます。

MySQL 5.7.5 以降、ONLY_FULL_GROUP_BY がデフォルトであり、適切な集計関数なしで非集計カラムが含まれている場合はエラーが発生します。

MySQL 5.7 以降のベスト プラクティス

特に MySQL 5.7 以降のバージョンで最適な互換性と明確性を得るには、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>

これは、subject 列の任意の値が各グループで受け入れられることを明示的に示し、クエリが正しく機能することを保証し、曖昧さを回避します。 ORDER BY 句により、最新のタイムスタンプが保持されます。

以上がMySQL で電子メールを送信者ごとに確実にグループ化し、最新の件名とタイムスタンプを取得するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。