目录

需求

分组group by的时候,需要在group by 每组的结果进行排序

如这样的需求:

需要找出所有文章中,每个作者按时间排序的文章(最新文章),想到的语句有:

select * from contents group by author order by pulishtime desc;

这个语句的执行结果如何?

请先来看下where,group by,having,order by的执行顺序

group by,order by的执行顺序

当一个语句中同时使用where,group by,having,order by的时候,执行顺序如下:

  1. 执行where xx对全表数据做筛选,返回第1个结果集
  2. 针对第1个结果集使用group by分组,返回第2个结果集
  3. 针对第2个结果集中的每1组数据执行select xx,有几组就执行几次,返回第3个结果集
  4. 针对第3个结集执行having xx进行筛选,返回第4个结果集
  5. 针对第4个结果集order by排序

结果

由此得知,group by会在order by之前执行,所以

select * from contents group by author order by pulishtime desc;

得到的结果,并没有按照作者、发布时间排序

Group By排序

那如何实现group by排序呢?最简单的方式是,使用子查询

select *
from 
    (select * from contents  order by pulishtime desc ) as a 
group by author;

这样就实现了group by排序,达到了想要的结果。