MySQL5.7+版本中子查询中使用order by无效

MySQL5.7+版本中子查询中使用order by无效

问题引入

  这周有个项目上线,其中有一个比较负责得聚合查询。子查询使用某个字段order by排序,外层语句根据order by得结果使用group by分组去重。

  预取结果:子查询使用order by xxx desc能正确根据某个字段倒叙排序,外层group by某个字段取到去重后取到第一条数据。

  实际效果:子查询order by xxx desc后并没有进行正确倒叙排序,导致外层group by取到的第一条数据不是倒叙排序后的结果数据第一条。

问题原因及排查

  经过排查,该查询在开发环境使用正常,但是线上环境排序异常。

使用shw version();查询两个环境MySQL版本,发现开发环境是5.6,而线上环境是5.7.查阅MySQL文档发现有句说明:It must not have ORDER BY with LIMIT.

即:在MySQL5.7+版本后,子查询中得order by必须加上limit,不然不会生效。

解决方案

  在子查询的order by xxx desc后加上limit 0,10.使子查询中order by真正生效。

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://maplefix.top/archives/order-by-is-invalid-in-mysql57