ホームページ >データベース >mysql チュートリアル >MySQL の GROUP BY と ORDER BY を使用して各送信者から最新の電子メールを取得するにはどうすればよいですか?
MySQL の GROUP BY
句と ORDER BY
句の詳細な説明と応用
MySQL データベース内のデータ テーブルを操作する場合、GROUP BY
句と ORDER BY
句の相互作用を理解することが重要です。 次のシナリオを考えてみましょう:
各送信者から最新の電子メールを取得することを目的として、電子メール テーブル内の行を送信者の電子メール アドレスごとにグループ化する必要があります。 ただし、次のクエリ:
<code class="language-sql">SELECT `timestamp`, `fromEmail`, `subject` FROM `incomingEmails` GROUP BY LOWER(`fromEmail`) ORDER BY `timestamp` DESC</code>
は間違った結果を生成します。 電子メールを送信者ごとにグループ化しますが、各グループの最新トピックが表示されない場合があります。 結果は次のように表示される場合があります:
<code>fromEmail: [email protected], subject: hello fromEmail: [email protected], subject: welcome</code>
実際のデータには次のものが含まれます:
<code>fromEmail: [email protected], subject: hello fromEmail: [email protected], subject: programming question fromEmail: [email protected], subject: welcome</code>
解決策: サブクエリと ANY_VALUE() 関数を使用します
この問題を解決するには、サブクエリを ANY_VALUE()
関数と組み合わせて使用できます。
<code class="language-sql">SELECT * FROM ( SELECT `timestamp`, `fromEmail`, ANY_VALUE(`subject`) AS `subject` FROM `incomingEmails` ORDER BY `timestamp` DESC ) AS tmp_table GROUP BY LOWER(`fromEmail`)</code>
MySQL 5.7 以降では、ANY_VALUE()
により、GROUP BY
句を含む SELECT
ステートメントで非集計カラムの使用が許可されます。 各グループから値をランダムに選択し、サブクエリが各送信者の電子メール アドレスの最新の件名を取得するようにします。
以上がMySQL の GROUP BY と ORDER BY を使用して各送信者から最新の電子メールを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。