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

eanckbw9  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(354)

这个问题在这里已经有答案了

mysql中的rank函数(11个答案)
两年前关门了。

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”(整体)只是攻击+防御的总和,通过使用这个查询,我可以按用户“ostats”值的降序显示用户。。
但是我如何分配和显示每个用户的等级,比如将“ostats”值最大的用户作为等级1,将“ostats”值第二高的用户作为等级2,依此类推。。?

fhity93d

fhity93d1#

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

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

mkh04yzy2#

可以使用变量指定行号:

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() 为此目的。

相关问题