MySQL在动态生成的排行榜中选择用户的排名

时间:2014-03-31 04:20:11

标签: mysql sql database

我有一个用户预测表,用于生成顶级用户及其排名的排行榜。

表格(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

2 个答案:

答案 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