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

文章目录

  • 方法一:排序 + 分组
  • 方法二:适用于自增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 a
         JOIN (SELECT id, MAX(create_time) AS last_create_time FROM student GROUP BY class_number) b
              ON a.id = b.id AND a.create_time = b.last_create_time;

【注意】:

mysql5.7 以及之后的版本,如果 GROUP BY 的子查询中包含 ORDER BYORDER 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 t1
	INNER 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 的记录,即每个分组中的最新记录。

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

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

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

你可能感兴趣的:(MySQL实践,mysql,数据库)