Group by中子查询order by排序失效问题分析

 戳蓝字「TopCoder」关注咱们哦!html

经过sql分组查询数据时,通常经过group by来完成,group by默认取相同的分组列(一列或者多列)中第一个数据。mysql

若是想获取sql分组中id最大的记录,咱们可能想到的sql以下(name列做为分组):web

select id,name from (select id,name from tt order by id descas t group by name

不过执行该sql发现并不能达到咱们的目的,输出数据以下:sql

// 表数据以下:
id,name
1,name1
2,name1
3,name2
4,name2

select id,name from (select id,name from tt order by id descas t group by name
// 输出结果以下:
id,name
1,name1
3,name2

这是为何呢?由于mysql 5.6以后版本对排序的sql解析作了优化,子查询中的排序是会被忽略的,因此上面的order by id desc未起到做用。若是子语句中排序不作优化那不就能够了么,查阅资料发现能够在子语句中加上limit来避免这种优化(加上limit至关于临时表限定了取值范围不会进行优化,若是是全表的话就被优化掉了)。微信

// 加上limit
select id,name from (select id,name from tt order by id desc limit 1024as t group by name

// 输出结果以下:
id,name
2,name1
4,name2

除了上述这种直接经过group by分组获得id最大记录以外,还能够经过分组获取到最大记录id,而后经过id获取对应记录(这里的id只要是记录的关键key便可)。app

// 经过分组获取关键key,而后再获取对应记录
select id,name from tt where id in (select max(idfrom tt group by name)

// 输出结果以下:
id,name
2,name1
4,name2

其实除了group by获取分组最后一个记录以外,还能够经过关联子查询方式来实现:优化

select id,name from tt a where id = (select max(idfrom tt where name = a.name) order by name

// 输出结果以下
id,name
2,name1
4,name2

经过以上group by和关联子查询两种方式的实现,获取分组的最后一条记录要么直接经过分组直接来获取,要么先获取到记录关键key而后经过关键key获取对应的记录便可。若是小伙伴还知道更多的实现方式,欢迎留言讨论~spa


 推荐阅读 .net


欢迎小伙伴 关注【TopCoder】 阅读更多精彩好文。

本文分享自微信公众号 - TopCoder(gh_12e4a74a5c9c)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索