赞
踩
在进行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 尽量写大一点
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。