我有一个用户预测表,用于生成顶级用户及其排名的排行榜。
表格(predictions
)如下所示:
id | userid | fixtureid | correct
1 | 1 | 1 | 1
2 | 2 | 5 | 0
3 | 2 | 6 | 1
4 | 2 | 7 | 1
5 | 3 | 6 | 0
目前,我使用此查询生成排行榜,然后循环结果:
SELECT userid, (correct * 3) AS score
FROM predictions
GROUP BY userid
ORDER BY score DESC
然后会显示一个与此类似的排行榜,在每行之后使用$i++;
在php中计算排名:
User Id | Score |
2 | 6 | #Rank is 1
1 | 3 | #Rank is 2
3 | 0 | #Rank is 3
我正在努力实现
我希望能够在排行榜中找到用户的排名,而无需构建整个表格,只需使用他们的userid
。
如何确保用户可以在未来增加到很多?
我想要实现的 Psuedo代码:
SELECT rank
FROM predictions
WHERE userid = 3
哪会回来:
User Id | Score |
3 | 0 | #Rank is 3
答案 0 :(得分:1)
我无法看到你如何生成专栏" Position",但无论如何, 你有没有探索过使用查看的可能性?
您只需要运行此命令ONCE:
CREATE VIEW `leaderboard` AS
SELECT
userId,
(correct * 3) AS score
FROM predictions
GROUP BY userid
ORDER BY score DESC
然后,您将创建的视图视为应用程序中的普通表。
以下是如何使用它的示例:
SELECT
(SELECT COUNT(*) FROM leaderboard WHERE score >= L.score) AS position,
L.userid,
L.score
FROM leaderboard L
WHERE L.userid = 3
答案 1 :(得分:1)
您必须使用汇总sum
功能才能按用户ID获得总分。
试试这个:
select
Rank, userid, score
from (
SELECT @rn:=@rn+1 as Rank, userid, sum(correct * 3) AS score
FROM predictions
, (select @rn:=0) row_nums
GROUP BY userid
ORDER BY score DESC
) user_ranks
where userid=3;
演示 @ SQL Fiddle