1. 程式人生 > 其它 >mysql先排序後分組

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
你的每一步,都不僅僅為自己而走