搜尋

首頁  >  問答  >  主體

mysql求游戏排名

伊谢尔伦伊谢尔伦2783 天前651

全部回覆(5)我來回復

  • PHP中文网

    PHP中文网2017-04-17 16:21:52

    雷雷

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 16:21:52

    select t.userid,t.score from (select * from active_gamescore order by Score desc,created desc) as t group by t.userid limit 20;

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-17 16:21:52

    更新:
    一個人只能回覆一次,很憂傷
    感謝幾位抽出時間去幫我解題
    測試了一下(5次平均)

    在1w資料量的情況下,
    @clcx_1315 :0.004s
    @伊拉克 : 0.009s
    @邢愛明 :0.006s
    我自己的 :0.016s

    在20w的資料量下:
    @clcx_1315 :0.104s
    @伊拉克 : 0.141s
    @邢愛明 :0.165s
    我自己的 :0.171s

    所以@clcx_1315的方法最優,十分感謝,學到了一個想法。
    從explain看,@clcx_1315的寫法只做了2次全表遍歷,其他都是3次,或許這就是原因了。

    ===========================之前的分隔線================== ==========
    琢磨了一種寫法,但效率有待提高

    select ta.user_id,ta.max_score,tb.min_time
    from (
            select a.user_id, max(a.score) max_score from  active_gamescore a where  a.active_id='58' group by a.user_id
            ) ta
    join (
            select a.user_id,a.score,min(a.created_at) min_time from active_gamescore a where  a.active_id='58' group by a.user_id,a.score
            ) tb 
            on ta.user_id=tb.user_id and ta.max_score=tb.score
    
    order by ta.max_score desc,tb.min_time asc 
    limit 20
    

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 16:21:52

    假設同一使用者下的created_at欄位值不重複,可以試試看下面的語句:

    SELECT t1.user_id, t1.score, t1.created_at
    FROM (
            SELECT
                @row_num:=IF(@prev_col1=t.user_id, @row_num+1, 1) AS row_number,
                t.*,
                @prev_col1:=t.user_id
            FROM (SELECT * FROM active_gamescore ORDER BY user_id, score DESC, created_at) t,
                 (SELECT @row_num:=1, @prev_col1:=NULL) var
    ) t1 WHERE row_number = 1
    ORDER BY t1.score DESC, t1.created_at
    LIMIT 20

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 16:21:52

    雷雷

    回覆
    0
  • 取消回覆