如何用MySQL查询每组首个/最后一个唯一条目及全部字段
MySQL获取分组内首个/最后一个条目(返回全字段)
针对你需要按groupId分组,获取每组首个或最后一个条目并返回全字段的需求,这里提供两种兼容不同MySQL版本的解决方案:
方案1:子查询关联(兼容MySQL 5.x及以上)
这种方法通过先找出每组的最小/最大id(对应组内首个/最后一个条目),再关联原表获取完整记录。
获取每组首个条目(最小id的记录)
SELECT t.* FROM your_table t INNER JOIN ( SELECT groupId, MIN(id) AS min_id FROM your_table GROUP BY groupId ) g ON t.id = g.min_id ORDER BY t.groupId;
获取每组最后一个条目(最大id的记录)
SELECT t.* FROM your_table t INNER JOIN ( SELECT groupId, MAX(id) AS max_id FROM your_table GROUP BY groupId ) g ON t.id = g.max_id ORDER BY t.groupId;
方案2:窗口函数(MySQL 8.0及以上)
如果你的MySQL版本是8.0或更高,使用窗口函数ROW_NUMBER()的写法更直观,便于扩展排序规则(比如按时间排序而非id)。
获取每组首个条目
SELECT id, groupId, data FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY groupId ORDER BY id ASC) AS rn FROM your_table ) t WHERE rn = 1 ORDER BY groupId;
获取每组最后一个条目
SELECT id, groupId, data FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY groupId ORDER BY id DESC) AS rn FROM your_table ) t WHERE rn = 1 ORDER BY groupId;
注意:如果你的“首个/最后一个”不是基于
id排序,而是其他字段(如创建时间create_time),只需将ORDER BY id ASC/DESC替换为ORDER BY create_time ASC/DESC即可。
内容的提问来源于stack exchange,提问作者Mikkel Følsgaard
相关产品推荐
相关产品推荐

