ホームページ >データベース >mysql チュートリアル >MySQL の GROUP BY と ORDER BY を使用して各送信者から最新の電子メールを取得するにはどうすればよいですか?

MySQL の GROUP BY と ORDER BY を使用して各送信者から最新の電子メールを取得するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-12 13:57:46984ブラウズ

How to Retrieve the Most Recent Email from Each Sender Using MySQL's GROUP BY and 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 サイトの他の関連記事を参照してください。

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