ホームページ >データベース >mysql チュートリアル >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>
問題は、返される timestamp
と subject
が各送信者の最新の電子メールを反映していない可能性があることです。
より堅牢なソリューションには、最初にタイムスタンプでデータを並べ替え、次に送信者ごとにグループ化するサブクエリが含まれます。
<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 サイトの他の関連記事を参照してください。