比较少用group by,没怎么注意配合order by时有什么问题.误以为是先排序再order by的.
今天测试时,发现刚好相反.
如
select * from tb group by gp order by id desc limit 2;
本意是想把所有的按id 大到小排列,然后从中取出 id 最大的 gp 不重复的二个记录,
但是这个sql是错误的,它实现的解析是,
按当前的顺序(什么顺序?数据的硬盘上储存顺序?反正就是到运行sql这时的顺序),把它们按gp 分成n组,
然后对每个gp分组中的行进行使用 order by id desc来调整顺序,所以排序这节只对 gp后的小分组中的顺序产生影响,并不影响gp外的顺序
如
数据
id gp
3 3
3 7
2 6
2 2
1 1
1 12
4 4
4 10
5 5
5 9
如果储存顺序是目前所看到的顺序时,
group by gp时
会是
gp 3
gp 2
gp 1
gp 4
gp 5
然后对上面的每一组gp进行order by id desc
如对 gp 3 进行后就是
gp 3 7
gp 3 3
而整个gp 还是
3
2
1
....
这样排列
如果想让gp也是按照id来排列,
那么应该让 group by 取时顺序是你想要的,也就是可以用子查询先排序出来再 group by
如
select * from (select * from tb order by id desc ) as tmp group by gp order by id desc limit 2;
从论坛上得到很多解决的方式:
SELECT * from tt where (id,a) in
(select id,max(a) from tt GROUP by id) ORDER BY a desc