使用GROUP BY/ORDER BY编写MSQL查询:获取收件箱最新邮件
解决MySQL获取每个邮箱最新邮件的问题
要实现从INBOX表中提取每个邮箱的最新邮件记录,这里有两种实用的MySQL方案,适配不同版本的数据库:
方法一:子查询关联法(兼容所有MySQL版本)
这种方法通过子查询先找出每个邮箱对应的最新日期,再关联原表获取完整记录,逻辑清晰且兼容性强:
SELECT i.email, i.createdDate, i.message FROM INBOX i INNER JOIN ( -- 先分组找出每个邮箱的最新创建日期 SELECT email, MAX(createdDate) AS latest_date FROM INBOX GROUP BY email ) AS latest ON i.email = latest.email AND i.createdDate = latest.latest_date -- 按最新日期倒序排列,和示例结果顺序一致 ORDER BY i.createdDate DESC;
逻辑说明
- 子查询部分:使用
GROUP BY email对邮箱分组,通过MAX(createdDate)拿到每个邮箱的最新邮件日期; - 内连接原表:将子查询的结果和原表INBOX匹配,筛选出每个邮箱对应最新日期的完整邮件记录;
- 最后通过
ORDER BY createdDate DESC按日期倒序排列,得到你期望的结果顺序。
方法二:窗口函数法(MySQL 8.0+ 支持)
如果你的MySQL版本是8.0及以上,窗口函数会是更简洁的选择:
SELECT email, createdDate, message FROM ( SELECT email, createdDate, message, -- 按邮箱分组,每组内按日期倒序给行编号,最新的行编号为1 ROW_NUMBER() OVER (PARTITION BY email ORDER BY createdDate DESC) AS rn FROM INBOX ) AS ranked -- 只保留每组编号为1的最新邮件 WHERE rn = 1 ORDER BY createdDate DESC;
逻辑说明
- 内层查询用
ROW_NUMBER()窗口函数,PARTITION BY email按邮箱分组,ORDER BY createdDate DESC让每组内最新的邮件排在最前面并标记为rn=1; - 外层查询筛选
rn=1的记录,直接得到每个邮箱的最新邮件; - 同样用
ORDER BY createdDate DESC调整结果顺序。
两种方法最终都会得到你想要的结果:
email -- createdDate -- message
mail3@test.com -- 16/02/2017 -- message7
mail1@test.com -- 13/02/2017 -- message2
mail2@test.com -- 10/02/2017 -- message4
内容的提问来源于stack exchange,提问作者mcmubi
相关产品推荐
相关产品推荐

