根据 mysql 数据为用户分配和显示排名

Assign and display ranks to users from mysql data

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" 值的降序显示用户..

但是我如何分配和显示每个用户的排名,例如"ostats"最有价值的用户排名第一,第二高"ostats" 评价用户为Rank 2等等..?

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

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() 来达到此目的。

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

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;