mysql关键字执行顺序

  1. from
  2. on
  3. join
  4. where
  5. group by
  6. having
  7. select
  8. distinc
  9. union
  10. order by

那么需要先排序在分组的操作怎么办

        由于版本原因,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里不包含如下条件就可以进行优化:

  1. UNION clause
  2. GROUP BY
  3. DISTINCT
  4. Aggregation
  5. 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;

        之外的话,可以利用结果集进行二次处理。比如利用中间表方式,先对数据进行排序。