文章目录
- 方法一:排序 + 分组
- 方法二:适用于自增ID和创建时间排序一致----可行
- 方法三:适用于自增ID和创建时间排序一致,查询性能最优----可行
- 方法四:通过DISTINCT关键字打破MySQL语句优化使排序生效----可行
- 方法六:窗口函数(Window Function)
我是一名立志把细节说清楚的博主,欢迎【关注】🎉 ~
原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~
如有错误、疑惑,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持
查询分组内最新一条数据。
方法一:排序 + 分组
下面这两个SQL的写法核心思路是相近的。
写法一:
SELECT *
FROM (SELECT * FROM student ORDER BY create_time DESC) s
GROUP BY s.class_number;
写法二:
SELECT *
FROM student aJOIN (SELECT id, MAX(create_time) AS last_create_time FROM student GROUP BY class_number) bON a.id = b.id AND a.create_time = b.last_create_time;
【注意】:
在 mysql5.7
以及之后的版本,如果 GROUP BY
的子查询中包含 ORDER BY
,ORDER BY
基本都会被优化器忽略掉,所以子查询在 GROUP BY 时,里面的 ORDER BY
排序不会生效。
解决方案可以参考下面文章:【问题解决】MySQL 5.7 版本 GROUP BY 组内排序无效的解决方法
方法二:适用于自增ID和创建时间排序一致----可行
SELECT *
FROM student
WHERE id IN ( SELECT MAX( id ) FROM student GROUP BY class_number)
ORDER BY class_number;
方法三:适用于自增ID和创建时间排序一致,查询性能最优----可行
SELECT t1.*
FROM student t1INNER JOIN ( SELECT MAX( id ) AS id FROM student GROUP BY class_number ) t2 ON t1.id = t2.id
方法四:通过DISTINCT关键字打破MySQL语句优化使排序生效----可行
SELECT *
FROM ( SELECT DISTINCT * FROM `student` ORDER BY id DESC ) AS t1
GROUP BY t1.class_number;
方法六:窗口函数(Window Function)
要求:MySQL数据库版本需要 8.0 及以上版本。
SELECT * FROM (SELECT id, student_name, class_number, create_time, ROW_NUMBER()OVER(PARTITION BY class_number ORDER BY create_time DESC) AS rowNumber FROM student
)t
WHERE rowNumber = 1;
- 首先将原始表格进行查询。
- 使用窗口函数
ROW_NUMBER()
来为每个分组中的记录进行标号。 PARTITION BY order_id
表示按照order_id
进行分组。ORDER BY create_time DESC
表示按照create_time
倒序排序。
- 使用窗口函数
- 然后,我们将这个查询结果作为子查询,并筛选出标号为 1 的记录,即每个分组中的最新记录。
我是一名立志把细节说清楚的博主,欢迎【关注】🎉 ~
原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~
如有错误、疑惑 ,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持