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中文网其他相关文章!