比较少用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