请教MySql中使用表子查询时,试着先排序后分组,出现排序失效的原因?

风语者
  • 13

1,今天试着码了一下教程里的题目,是找出每一个班级的身高最高的学生,用的是先order by降序排序所有学生升高,再用
group by分组每一个班级取第一个值,却发现当使用子查询时,得到的仍旧是未排序时的结果,即没有取到最高身高,想问下为何使用子查询时,order by会失效,谢谢!

clipboard.png

↑这是建立的表,有班级和身高记录

clipboard.png

↑使用group by查询一切正常,获得的都是每个id班级的第一个记录

clipboard.png

↑使用order by查询一切正常,获得的是按照年龄降序排序的结果

clipboard.png

↑当使用表子查询时,结果和前面单独group by一样,排序并没有生效,下面是代码
select from (select from student_text2 order by height desc)
as student_wudi group by c_id;(有人说加limit会有用,试过无效)

尝试着将select范围添加进去,发现并没啥用...
select student_wudi. from (select from student_text2 order by height desc)
student_wudi
group by c_id;

以上就是遇到的问题,可能对大佬来说是小问题,不过这着实困扰我..希望能得到帮助,谢谢!

回复
阅读 8.1k
4 个回答

5.7的吧?5.7以后对排序的sql解析做了优化,子查询中的排序是会被忽略的
5.6你这样写是没问题的,5.7的话需要换一换了,使用聚合函数取出你要的记录再关联原表获取第一条记录
或者使用组内排序生成行号后再按行号取第一条也行

clipboard.png

clipboard.png

找到原因了,是没有在临时表内的语句中添加limit,可能也是和版本有关,教程中使用的是老的mysql,自己用的是5.7,不管怎么样还是顺利解决了

愣是没看懂问题在哪里
我觉得没有问题啊。。就算你子查询排序了你外层的sql不是又分组了吗?有一句话叫做分组之前必排序。

子查询加limit的话,要足够大包括要查询所有的数据;如limit 9999

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏