2014-03-31 63 views
0

我有一張用戶預測表,我用它來生成頂級用戶及其排名的排行榜。MySQL在動態生成的排行榜中選擇用戶排名

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

我怎樣才能做到這一點軸心記住用戶可以在未來增加到大量?


的僞的我想要實現代碼

SELECT rank 
FROM predictions 
WHERE userid = 3 

這將返回:

User Id | Score | 
    3 | 0 | #Rank is 3 

回答

1

我看不出你是如何產生的列 「位置」 ,但無論如何, 您是否探索過使用查看的可能性?

你只需要運行一次此命令:

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 
+0

的'rank' /'在PHP動態生成position' $ I ++'每條記錄,它實際上不存在這使它更難。 – Dan

+1

嗨@Silver89,我已經更新了我的答案。 – Yorro

1

你必須使用聚合sum函數來獲取用戶ID的總成績。

試試這個:使用`

select 
    Rank, userid, score 
from (
    SELECT @rn:[email protected]+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