我是一名立志把细节说清楚的博主,欢迎【关注】 ~
原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~
如有错误、疑惑,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持
查询分组内最新一条数据。
下面这两个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 BY
,ORDER BY
基本都会被优化器忽略掉,所以子查询在 GROUP BY 时,里面的 ORDER BY
排序不会生效。
解决方案可以参考下面文章:【问题解决】MySQL 5.7 版本 GROUP BY 组内排序无效的解决方法
SELECT *
FROM student
WHERE id IN ( SELECT MAX( id ) FROM student GROUP BY class_number)
ORDER BY class_number;
SELECT t1.*
FROM student t1
INNER JOIN ( SELECT MAX( id ) AS id FROM student GROUP BY class_number ) t2 ON t1.id = t2.id
SELECT *
FROM ( SELECT DISTINCT * FROM `student` ORDER BY id DESC ) AS t1
GROUP BY t1.class_number;
要求: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
倒序排序。我是一名立志把细节说清楚的博主,欢迎【关注】 ~
原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~
如有错误、疑惑 ,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持