文章目录
我是一名立志把细节说清楚的博主,欢迎【关注】🎉 ~
原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~
如有错误、疑惑,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持
查询分组内最新一条数据。
方法一:排序 + 分组
下面这两个SQL的写法核心思路是相近的。
写法一:
SELECT*FROM(SELECT*FROM student ORDERBY create_time DESC) s
GROUPBY s.class_number;
写法二:
SELECT*FROM student a
JOIN(SELECT id,MAX(create_time)AS last_create_time FROM student GROUPBY class_number) b
ON 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(SELECTMAX( id )FROM student GROUPBY class_number)ORDERBY class_number;
方法三:适用于自增ID和创建时间排序一致,查询性能最优----可行
SELECT t1.*FROM student t1
INNERJOIN(SELECTMAX( id )AS id FROM student GROUPBY class_number ) t2 ON t1.id = t2.id
方法四:通过DISTINCT关键字打破MySQL语句优化使排序生效----可行
SELECT*FROM(SELECTDISTINCT*FROM`student`ORDERBY id DESC)AS t1
GROUPBY t1.class_number;
方法六:窗口函数(Window Function)
要求:MySQL数据库版本需要 8.0 及以上版本。
SELECT*FROM(SELECT id, student_name, class_number, create_time, ROW_NUMBER()OVER(PARTITIONBY class_number ORDERBY 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 的记录,即每个分组中的最新记录。
我是一名立志把细节说清楚的博主,欢迎【关注】🎉 ~
原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~
如有错误、疑惑 ,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持
版权归原作者 我梦Leo 所有, 如有侵权,请联系我们删除。