首页 >数据库 >mysql教程 >如何使用 MySQL 的 GROUP BY 和 ORDER BY 检索每个发件人的最新电子邮件?

如何使用 MySQL 的 GROUP BY 和 ORDER BY 检索每个发件人的最新电子邮件?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-12 13:57:461028浏览

How to Retrieve the Most Recent Email from Each Sender Using MySQL's GROUP BY and ORDER BY?

MySQL 的 GROUP BYORDER BY 子句详解及应用

在 MySQL 数据库中操作数据表时,理解 GROUP BYORDER 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn