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,依此类推..?
答案 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()
。