SELECT * FROM user_paper_relation WHERE paper_id = "" GROUP BY examer_id ORDER BY total_score DESC
问题:发现先执行的group by,后执行order by,我要的结果是先排序再分组。
第二种写法:
1 2 3 4 5 6
SELECT * FROM ( SELECT * FROM user_paper_relation WHERE paper_id = "" ORDER BY consuming_time DESC ) u GROUP BY u.examer_id
问题:本以为将排序写成一个子查询应该会先排序后分组,执行后发现问题同第一种写法一样。
第三种写法(最终解决的写法):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
SELECT a.* FROM ( SELECT * FROM user_paper_relation WHERE paper_id = "" ORDER BY consuming_time LIMIT 0, 300 ) a GROUP BY a.examer_id
解决方式:在子查询中添加LIMIT 0,300则可使子查询语句即排序执行完再进行分组。
问题原因
1 2 3 4 5
原因:在mysql5.7中,如果不加limit,系统会把order by优化掉。 在mysql5.7手册的8.2.2.1中有解释: 子查询的优化是使用半连接的策略完成的(The optimizer uses semi-join strategies to improve subquery execution) 使用半连接进行优化,子查询语句必须满足一些标准(In MySQL, a subquery must satisfy these criteria to be handled as a semi-join)。 其中一个标准是:必须不是一个包含了limit和order by的语句(It must not have ORDER BY with LIMIT.)