ホームページ >データベース >mysql チュートリアル >MySQL で送信者ごとに最新の電子メールを効率的に選択するにはどうすればよいですか?

MySQL で送信者ごとに最新の電子メールを効率的に選択するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-12 14:10:43194ブラウズ

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

最近のメール取得のための MySQL クエリの最適化

MySQL の GROUP BY 句と ORDER BY 句はデータ整理のための強力なツールですが、送信者ごとに最新の電子メールを効率的に選択するには慎重な検討が必要です。 単純なアプローチでは誤った結果が生じる可能性があります。

たとえば、次のクエリは電子メールを送信者ごとにグループ化し、タイムスタンプごとに並べ替えようとします。

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

問題は、返される timestampsubject が各送信者の最新の電子メールを反映していない可能性があることです。

より堅牢なソリューションには、最初にタイムスタンプでデータを並べ替え、次に送信者ごとにグループ化するサブクエリが含まれます。

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

これにより、タイムスタンプ順に並べられた一時テーブル (tmp_table) が作成され、グループ化操作で送信者ごとに最新の電子メールが選択されるようになります。

ただし、この方法は、GROUP BY 句で非集計カラムの任意の値を選択する MySQL の動作に依存します。これは非標準 SQL であるため、予測できない結果が生じる可能性があります。 MySQL 5.7.5 ではデフォルトで ONLY_FULL_GROUP_BY が導入されたため、このアプローチには問題がありました。

これに対処するには、ANY_VALUE() (MySQL 5.7 で導入) を使用できます。これにより、非集計カラムのグループから任意の値を選択できるようになります:

<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>

このクエリは、MySQL データベース内の各送信者の最新の電子メールを取得するための、より信頼性が高く、標準に準拠した方法を提供します。

以上がMySQL で送信者ごとに最新の電子メールを効率的に選択するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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