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>
このクエリは送信者ごとにグループ化しようとしていますが、選択された subject
と timestamp
は常に最新のものではありません。
サブクエリ ソリューション
より信頼性の高い方法には、グループ化する前に順序付けに優先順位を付けるサブクエリが含まれます。
<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 サイトの他の関連記事を参照してください。