根据 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;
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;