从mysql数据分配和显示等级给用户

时间:2018-09-22 20:13:33

标签: php mysql sql mariadb ranking

SELECT u.user_id, u.user_uid, s.ostats, s.attack, s.defense
FROM stats s JOIN
     users u 
     ON s.id = u.user_id
ORDER BY s.ostats DESC;

因此在上述数据中,“ ostats ”(总体)只是 attack + defense 的总和,通过使用此查询,我可以按用户降序显示用户“稳定”值。

但是我该如何分配和显示每个用户的排名,例如“ ostats”值最高的用户为等级1,“ ostats”值第二高的用户为等级2,依此类推..?

2 个答案:

答案 0 :(得分:1)

使用变量跟踪行号怎么办?

SET @rank = 0;

SELECT 
    u.user_id,
    u.user_uid, 
    s.ostats, 
    s.attack, 
    s.defense,
    (@rank:=@rank + 1) AS rank
FROM stats s 
    JOIN users u on s.id = u.user_id 
ORDER BY s.ostats DESC;

答案 1 :(得分:0)

您可以使用变量分配行号:

SELECT u.user_id,u.user_uid, s.ostats, s.attack, s.defense,
       s.ranking
FROM (SELECT s.*, (@rn := @rn + 1) as ranking
      FROM (SELECT s.* FROM stats s ORDER BY s.ostats DESC) s CROSS JOIN
           (SELECT @rn := 0) params
     ) s JOIN
     users u 
     ON s.id = u.user_id
ORDER BY s.ostats DESC;

如果出现平局,这将为不同的用户提供不同的排名。如果这是一个问题,则可以使用以下修改的形式:

SELECT u.user_id,u.user_uid, s.ostats, s.attack, s.defense,
       s.ranking
FROM (SELECT s.*,
             (@rn := if(@o = ostats, @rn,
                        if(@o := ostats, @rn + 1, @rn + 1)
                       )
             ) as ranking
      FROM (SELECT s.* FROM stats s ORDER BY s.ostats DESC) s CROSS JOIN
           (SELECT @rn := 0, @o := -1) params
     ) s JOIN
     users u 
     ON s.id = u.user_id
ORDER BY s.ostats DESC;

当然,在MySQL 8.0中,您可以为此目的使用row_number()rank()dense_rank()