关于SQL中group by 和order by 配合使用需要注意到的细节问题

在进行SQL查询时,我们想要对结果进行分组,并且拿到每个分组中最新的数据。例如

一个表table中有stage 和create_time 两个字段,我们想要以stage为分组条件,并且拿到每个stage中create_time最新的结果。

一部分人可能会直接 GROUP BY stage ORDER BY create_time DESC 这样时不行的,因为SQL语句会先执行GROUP BY 再ORDER BY 这样得到的只是把分组后的结果排序。

可能有人说那我把GROPU BY写在后面不就行了吗,这种写法语法上就是错误的。

正确的思路应该是先对表进行ORDER BY 查询,把查询出来的结果集作为子表进行分组查询

select * from (SELECT * FROM table ORDER BY create_time desc) t1 GROUP BY stage 

很多人以为这样就OK了,确实,从逻辑上来说确实正确。但是忽略了一个问题,因为MySQL有优化器,子查询中的ORDER BY会被忽略掉。我们可以在子查询中加上 LIMIT 来避免优化

select * from (SELECT * FROM table ORDER BY create_time desc LIMIT 10000) t1 GROUP BY stage

LIMIT 尽量写大一点

你可能感兴趣的:(java,sql)