MySQL的“分组依据”和“排序依据”

我希望能够从电子邮件表中选择一堆行并按发件人分组。我的查询如下所示:


SELECT 

    `timestamp`, `fromEmail`, `subject`

FROM `incomingEmails` 

GROUP BY LOWER(`fromEmail`) 

ORDER BY `timestamp` DESC

该查询几乎可以按我希望的方式工作-它选择按电子邮件分组的记录。问题在于主题和时间戳记与特定电子邮件地址的最新记录不符。


例如,它可能返回:


fromEmail: john@example.com, subject: hello

fromEmail: mark@example.com, subject: welcome

当数据库中的记录是:


fromEmail: john@example.com, subject: hello

fromEmail: john@example.com, subject: programming question

fromEmail: mark@example.com, subject: welcome

如果“编程问题”主题是最新的,那么在对电子邮件进行分组时如何使MySQL选择该记录?


慕码人2483693
浏览 584回答 4
4回答

慕雪6442864

在ORDER BY之后通过用GROUP BY包裹查询来进行GROUP BY,如下所示:SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t GROUP BY t.from

白衣非少年

正如答复中已经指出的那样,当前答案是错误的,因为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(),在大多数情况下不会使用。
打开App,查看更多内容
随时随地看视频慕课网APP