文章目录
- 问题描述
- 形成原因
- 解决方案
-
- [方案一:使用 HAVING 关键字](#方案一:使用 HAVING 关键字)
- [方案二:使用 LIMIT 关键字](#方案二:使用 LIMIT 关键字)
- [方案三: 使用 DISTINCT 关键字。](#方案三: 使用 DISTINCT 关键字。)
- [方案四: 使用子查询。](#方案四: 使用子查询。)
- [方案五: @count :=@count+1。](#方案五: @count :=@count+1。)
我是一名立志把细节说清楚的博主,欢迎【关注】🎉 ~
原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~
如有错误、疑惑,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持
问题描述
查询每个班最后一个加入的学生信息。
sql
SELECT *
FROM (SELECT * FROM student ORDER BY create_time DESC) s
GROUP BY s.class_number;
形成原因
在 5.7 版本中引入新特性 derived_merge 优化过后,group by子句中使用order by导致order by失效。
解决方案
方案一:使用 HAVING 关键字
HAVING
关键字的详细说明和用法请看文章:
【MySQL】数据分组(关键字:GROUP BY)过滤分组(关键字:HAVING)
sql
SELECT *
FROM (SELECT * FROM student HAVING 1=1 ORDER BY create_time DESC) s
GROUP BY s.class_number;
方案二:使用 LIMIT 关键字
LIMIT
关键字的详细说明和用法请看文章:
【MySQL】查询结果,对结果进行限制(关键字:LIMIT 和 OFFSET)
sql
SELECT *
FROM (SELECT * FROM student ORDER BY create_time DESC LIMIT 1000000) s
GROUP BY s.class_number;
方案三: 使用 DISTINCT 关键字。
DISTINCT
关键字的详细说明和用法请看文章:
【MySQL】查询数据,过滤重复结果数据(关键字:DISTINCT)
sql
SELECT *
FROM (SELECT DISTINCT(id), student_name, class_number FROM student ORDER BY create_time DESC) s
GROUP BY s.class_number;
方案四: 使用子查询。
如果有有序递增的主键 id 或其他字段,可以使用子查询的思路实现。
sql
SELECT * FROM student WHERE id IN (SELECT MAX(id) FROM student GROUP BY class_number);
方案五: @count :=@count+1。
查询的字段中 增加 @count :=@count+1
。
公司的数据库是 MySQL 5.7
版本,很奇怪,使用了上面所有的方法后,仍然不生效,又无法使用 MySQL 8
的 OVER()
函数,最后我尝试了这个方案后生效了。
sql
SELECT id, student_name, class_number, @count :=@count+1
FROM (SELECT id, student_name, class_number, @count :=@count+1 FROM student ORDER BY create_time DESC) s
GROUP BY s.class_number;
我是一名立志把细节说清楚的博主,欢迎【关注】🎉 ~
原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~
如有错误、疑惑 ,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持