通过sql分组查询数据时,一般通过group by来完成,group by默认取相同的分组列(一列或者多列)中第一个数据。
如果想获取sql分组中id最大的记录,我们可能想到的sql如下(name列作为分组):
<code>select
id
,name
from
(select
id
,name
from
ttorder
by
id
desc
)as
tgroup
by
name
/<code>
不过执行该sql发现并不能达到我们的目的,输出数据如下:
<code>// 表数据如下: id,name 1,name1 2,name1 3,name2 4,name2select
id
,name
from
(select
id
,name
from
ttorder
by
id
desc
)as
tgroup
by
name
// 输出结果如下:id
,name
1
,name13
,name2/<code>
这是为什么呢?因为mysql 5.6之后版本对排序的sql解析做了优化,子查询中的排序是会被忽略的,所以上面的order by id desc未起到作用。 如果子语句中排序不做优化那不就可以了么,查阅资料发现可以在子语句中加上limit来避免这种优化(加上limit相当于临时表限定了取值范围不会进行优化,如果是全表的话就被优化掉了)。
<code>// 加上limitselect
id
,name
from
(select
id
,name
from
ttorder
by
id
desc
limit
1024
)as
tgroup
by
name
// 输出结果如下:id
,name
2
,name14
,name2/<code>
除了上述这种直接通过group by分组得到id最大记录之外,还可以通过分组获取到最大记录id,然后通过id获取对应记录(这里的id只要是记录的关键key即可)。
<code>// 通过分组获取关键key,然后再获取对应记录select
id
,name
from
ttwhere
id
in
(select
max
(id
)from
ttgroup
by
name
) // 输出结果如下:id
,name
2
,name14
,name2/<code>
其实除了group by获取分组最后一个记录之外,还可以通过关联子查询方式来实现:
<code>select
id
,name
from
tt awhere
id
= (select
max
(id
)from
ttwhere
name
= a.name)order
by
name
// 输出结果如下id
,name
2
,name14
,name2/<code>
通过以上group by和关联子查询几种方式的实现,获取分组的最后一条记录要么直接通过分组直接来获取,要么先获取到记录关键key然后通过关键key获取对应的记录即可。如果小伙伴还知道更多的实现方式,欢迎留言一起讨论~