在日常开发过程中,大家应该对【ORDER BY】非常熟悉了,相信今天分享的内容应该会让你重新认识【ORDER BY】,请先看下面的SQL和查询结果:
这个SQL很简单,包含了一个子查询,子查询里面对id字段做降序,然后外层对supplier_id进行过滤,最终过滤的结果也是按照id降序的。
现在我们在SQL最后加上【GROUP BY】,如下图:
可以看到返回的是id=15,并没有返回期望的id=110。
在解释这个问题前,我们先说明一下当前【SQL_MODE】不包含【ONLY_FULL_GROUP_BY】,否则这样的SQL会报错的。
我们先对第1条SQL做【EXPLAIN】,然后【SHOW WARNINGS】看看实际执行的SQL,如下图:
然后我们对加了【GROUP BY】的SQL执行相同的操作,如下图:
前后对比会发现,加了【GROUP BY】的SQL在真正执行的时候忽略了【ORDER BY】。
为什么会这样呢?其实是MySQL对驱动表优化造成的。
注意,以下3种情况全部满足时,驱动表里的【ORDER BY】才不会被忽略:
既然我们已经知道原因了,那么该怎么解决这个问题呢?相信聪明的同学应该能够想到下面这种解决方案:
需要指出的是,上面的SQL在使用【GROUP BY】时其实是比较规范的,不依赖什么【ONLY_FULL_GROUP_BY】。
为了让大家有兴趣看MySQL官方文档,这里我卖个关子抛出另一种解决方案:
大家可以好好看看这篇MySQL文档 derived-table-optimization,答案就在里面!
沙发