戳蓝字「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 desc) as 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 desc) as 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 1024) as 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(id) from tt group by name)
// 输出结果以下:
id,name
2,name1
4,name2
其实除了group by获取分组最后一个记录以外,还能够经过关联子查询方式来实现:优化
select id,name from tt a where id = (select max(id) from tt where name = a.name) order by name
// 输出结果以下
id,name
2,name1
4,name2
经过以上group by和关联子查询两种方式的实现,获取分组的最后一条记录要么直接经过分组直接来获取,要么先获取到记录关键key而后经过关键key获取对应的记录便可。若是小伙伴还知道更多的实现方式,欢迎留言讨论~spa
推荐阅读 .net
本文分享自微信公众号 - TopCoder(gh_12e4a74a5c9c)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。