mysql关键字执行顺序
那么需要先排序在分组的操作怎么办
由于版本原因,mysql5.7以下版本,可以用这个样去处理:
1 | select a.operatetime,a.ERRORMESSAGE from (select operatetime,ERRORMESSAGE from gumessagelog where businessno = 'xxxx' ORDER BY OperateTime) a GROUP BY a.ERRORMESSAGE; |
mysql5.7以上,包括5.7版本,上面的方法就不适用了,5.7版本进行了优化,优先按关键字处理。那么可以这样做:
1 | select left(group_concat(operatetime order by operatetime desc),"19"),ERRORMESSAGE from gumessagelog where businessno = 'xxxx' GROUP BY ERRORMESSAGE; |
left函数可以换成其他的,19的长短也可以换。
那么为什么会被优化
5.7中Derived table变形记
查阅相关资料了解到MySql 5.7对子查询进行了优化,认为子查询中的order by可以进行忽略,只要Derived table里不包含如下条件就可以进行优化:
- UNION clause
- GROUP BY
- DISTINCT
- Aggregation
- LIMIT or OFFSET
那么对之前语句进行改写,就可以加上limit处理。
1 | select a.operatetime,a.ERRORMESSAGE from (select operatetime,ERRORMESSAGE from gumessagelog where businessno = 'xxxx' ORDER BY OperateTime desc limit 9999) a GROUP BY a.ERRORMESSAGE; |
之外的话,可以利用结果集进行二次处理。比如利用中间表方式,先对数据进行排序。