我希望能够从电子邮件表中选择一堆行并按发件人分组。我的查询如下所示:SELECT `timestamp`, `fromEmail`, `subject`FROM `incomingEmails` GROUP BY LOWER(`fromEmail`) ORDER BY `timestamp` DESC该查询几乎可以按我希望的方式工作-它选择按电子邮件分组的记录。问题在于主题和时间戳记与特定电子邮件地址的最新记录不符。例如,它可能返回:fromEmail: john@example.com, subject: hellofromEmail: mark@example.com, subject: welcome当数据库中的记录是:fromEmail: john@example.com, subject: hellofromEmail: john@example.com, subject: programming questionfromEmail: mark@example.com, subject: welcome如果“编程问题”主题是最新的,那么在对电子邮件进行分组时如何使MySQL选择该记录?
4 回答
慕雪6442864
TA贡献1812条经验 获得超5个赞
在ORDER BY之后通过用GROUP BY包裹查询来进行GROUP BY,如下所示:
SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t GROUP BY t.from
白衣非少年
TA贡献1155条经验 获得超0个赞
正如答复中已经指出的那样,当前答案是错误的,因为GROUP BY从窗口中任意选择记录。
如果使用MySQL 5.6或MySQL 5.7和ONLY_FULL_GROUP_BY,则正确的(确定性)查询为:
SELECT incomingEmails.*
FROM (
SELECT fromEmail, MAX(timestamp) `timestamp`
FROM incomingEmails
GROUP BY fromEmail
) filtered_incomingEmails
JOIN incomingEmails USING (fromEmail, timestamp)
GROUP BY fromEmail, timestamp
为了使查询有效运行,需要正确的索引编制。
请注意,为简化起见,我删除了LOWER(),在大多数情况下不会使用。
添加回答
举报
0/150
提交
取消