MySQL 5.7中GROUP BY分组获取各message_id最早提交时间
MySQL 5.7获取每组最早日期的解决方案
问题根源
你之前的查询结果和原查询一致,是因为GROUP BY子句里包含了submit_dt。每个不同的submit_dt值会被当成独立分组,而你两条message_id=1234的记录日期不同,所以还是会分成两组,最终返回所有原始记录。
方法1:修正GROUP BY分组字段(最简方案)
只按email_id和message_id分组(这两个是你要聚合的维度),同时用MIN(submit_dt)提取每组的最早日期,并给结果列起别名匹配你期望的格式:
SELECT `email_id`, `message_id`, MIN(`submit_dt`) AS `submit_dt` FROM `submissions` -- 注意:你之前的查询误写了表名为`john_submissions`,请修正为实际表名`submissions` WHERE `email_id` = '10' GROUP BY `email_id`, `message_id`;
执行后就能得到你想要的结果:
| email_id | message_id | submit_dt | ----------------------------------------------- | 10 | 1234 | 2025-01-23 13:30:01 | ----------------------------------------------- | 10 | 2345 | 2025-02-08 13:00:02 | -----------------------------------------------
方法2:子查询关联(适用于需返回更多字段的场景)
如果之后需要获取该最早日期对应的其他表字段(比如提交内容、状态等),可以用子查询先筛选出每组的最早日期,再关联原表匹配数据行:
SELECT s.`email_id`, s.`message_id`, s.`submit_dt` -- 这里可以添加其他需要返回的字段 FROM `submissions` s INNER JOIN ( -- 子查询获取每个message_id的最早提交日期 SELECT `message_id`, MIN(`submit_dt`) AS earliest_dt FROM `submissions` WHERE `email_id` = '10' GROUP BY `message_id` ) t ON s.`message_id` = t.`message_id` AND s.`submit_dt` = t.earliest_dt WHERE s.`email_id` = '10';
这种方法的优势是可以完整获取最早提交记录的所有字段,而不仅仅是聚合后的日期。
内容的提问来源于stack exchange,提问作者John Beasley
相关产品推荐
相关产品推荐

