为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕码人2483693 2019-10-08 14:47:01
我希望能够从电子邮件表中选择一堆行并按发件人分组。我的查询如下所示: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


查看完整回答
反对 回复 2019-10-08
?
白衣非少年

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(),在大多数情况下不会使用。


查看完整回答
反对 回复 2019-10-08
  • 4 回答
  • 0 关注
  • 583 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信