0


【MySQL】查询分组内最新一条数据

文章目录

我是一名立志把细节说清楚的博主,欢迎【关注】🎉 ~

原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~

如有错误、疑惑,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持


查询分组内最新一条数据。

方法一:排序 + 分组

下面这两个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 的记录,即每个分组中的最新记录。

我是一名立志把细节说清楚的博主,欢迎【关注】🎉 ~

原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~

如有错误、疑惑 ,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持

标签: mysql 数据库

本文转载自: https://blog.csdn.net/m0_50513629/article/details/140965979
版权归原作者 我梦Leo 所有, 如有侵权,请联系我们删除。

“【MySQL】查询分组内最新一条数据”的评论:

还没有评论