mysql先排序后分組


有一個需求,在答題主記錄表里面根據用戶答對題目數量(correct_answer)和答題時間(paper_time)進行排行。即:答對題目數量最大者排行最前,相同數量則根據時間最小來排行。

最開始想的思路:在用戶表保存這兩個字段,方便后期排序。但是無奈伙伴認為沒必要,那就另辟蹊徑。
直接上第一次的Sql:

SELECT appnickname,correct_answer,paper_time FROM (SELECT * FROM `nms_zpaper` ORDER BY correct_answer desc,paper_time asc LIMIT 1000000) a WHERE a.correct_answer>0 GROUP BY a.appuserid ORDER BY a.correct_answer DESC
之所以在子查詢里面使用了limit限制條數,是因為高版本mysql,會對子查詢進行優化,忽略order by這樣也就失去了排序的意義。

通過查閱相關資料了解到MySql 5.7對子查詢進行了優化,認為子查詢中的order by可以進行忽略,只要Derived table里不包含如下條件就可以進行優化:

UNION clause
GROUP BY
DISTINCT
Aggregation
LIMIT or OFFSET

 

因此可以在子查詢中使用group by pk分組,不讓mysql進行子查詢優化。修改之后的sql語句如下:

SELECT appnickname,correct_answer,paper_time FROM (SELECT * FROM `nms_zpaper` group by paper_id ORDER BY correct_answer desc,paper_time asc) a WHERE a.correct_answer>0 GROUP BY a.appuserid ORDER BY a.correct_answer DESC

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM