Home  >  Q&A  >  body text

mysql求游戏排名

伊谢尔伦伊谢尔伦2742 days ago621

reply all(5)I'll reply

  • PHP中文网

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

    select user_id,a.sc,min(created_at) tm 
    from (select user_id,max(score) sc from active_gamescore group by user_id) a 
    join active_gamescore b 
    on a.user_id=b.user_id and a.sc=b.score 
    group by a.user_id,a.sc 
    order by a.sc desc,tm asc limit 20;

    reply
    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;

    reply
    0
  • 巴扎黑

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

    Update:
    A person can only reply once, which is very sad.
    Thank you for taking the time to help me solve the problem.
    Tested it (average of 5 times)

    In the case of 1w data volume,
    @clcx_1315: 0.004s
    @Iraq: 0.009s
    @邢爱明: 0.006s
    My own: 0.016s

    Under the data volume of 20w:
    @clcx_1315: 0.104s
    @Iraq: 0.141s
    @邢爱明: 0.165s
    My own: 0.171s

    So @clcx_1315’s method is the best. Thank you very much. I learned an idea.
    From the explanation, @clcx_1315's writing method only does 2 full table traversals, and the others are 3 times. Maybe this is the reason.

    ============================Previous divider================== ==========
    I thought about a writing method, but the efficiency needs to be improved

    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
    

    reply
    0
  • 高洛峰

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

    Assuming that the created_at field values ​​under the same user are not repeated, you can try the following statement:

    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

    reply
    0
  • PHP中文网

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

    SELECT
        yws0.user_id,
        yws0.score,
        min(create_time) AS create_time
    FROM
        active_gamescore yws0
    WHERE
        (user_id, score) IN (
            SELECT
                yws.user_id,
                yws.max_score
            FROM
                (
                    SELECT
                        user_id,
                        max(score) AS max_score
                    FROM
                        active_gamescore
                    GROUP BY
                        user_id
                ) yws
        )
    GROUP BY
        yws0.user_id,
        yws0.score
    ORDER BY
        SCORE DESC
    LIMIT 3

    reply
    0
  • Cancelreply