2013-07-01 52 views
0

雖然製作遊戲MySQL的調用來獲取前10名如下:MySQL的等級不匹配的高得分表

SELECT username, score FROM userinfo ORDER BY score DESC LIMIT 10 

這似乎體面足夠的工作,但是當與呼叫配對獲得如果玩家與其他玩家的得分相同,則單個玩家的等級可能會不同。讓玩家排名的電話如下:從第一個電話

SELECT (SELECT COUNT(*) FROM userinfo ui WHERE (ui.score, ui.username) >= (uo.score, uo.username)) AS rank FROM userinfo uo WHERE username='boddie'; 

示例結果:從第二個電話

+------------+-------+ 
| username | score | 
+------------+-------+ 
| admin  | 4878 | 
| test3  | 3456 | 
| char  | 785 | 
| test2  | 456 | 
| test1  | 253 | 
| test4  | 78 | 
| test7  |  0 | 
| boddie  |  0 | 
| Lz   |  0 | 
| char1  |  0 | 
+------------+-------+ 

示例結果

+------+ 
| rank | 
+------+ 
| 10 | 
+------+ 

可以看出,第一呼叫將名單上的第8位玩家排名,但第二次呼叫將他置於第10位。哪些更改或我能做些什麼來使這些呼叫得到匹配結果?

非常感謝您的幫助!

+0

您有效地內的得分降序和用戶名降序排序,因此boddie比LZ和CHAR1 – Kickstart

+0

對阿來下,我開始看到在看下面的所有偉大的答覆後的錯誤。有很多好的哈哈 – boddie

回答

2

您需要先查詢到:

ORDER BY 
    score DESC, 
    username DESC 

這樣將達到在10級...這是由於在第二個查詢用戶名比較:

(ui.score, ui.username) >= (uo.score, uo.username)

+0

Upvote,因爲我們在同一分鐘有幾乎相同的答案,但可能想按字母升序的名字,而不是降序:) – BryPie

+0

@BryPie你可以做通過改變第二個查詢 – Stephan

+0

結束了使用這個由於簡單,它與我有很好的工作。謝謝! – boddie

2

我會更改您的訂單,包括用戶名,以便您始終獲得相同的訂單。因此,它看起來像:

... ORDER BY score DESC, username ASC ... 
+0

+1想像一樣:) – Stephan

1
SELECT 
    uo.username, 
    (SELECT COUNT(*)+1 FROM userinfo ui WHERE ui.score>uo.score) AS rank 
FROM userinfo uo 
WHERE uo.username='boddie' 

或者,如果你需要得到用戶名,得分和排名:

SELECT 
    uo.username, 
    uo.score, 
    (@row := @row + 1) AS rank 
FROM userinfo uo 
JOIN (SELECT @row := 0) r 
ORDER BY uo.score DESC, uo.username ASC 

您可以添加

HAVING uo.username = 'boddie' 

得到只有一個用戶

+0

在你的情況下,所有有分數= 0的用戶,他們將有相同的排名:) – Stephan

+0

是的,如果多個用戶有相同的分數相同。 – kcsoft

+0

是的,但你需要一種方式來區分它們,就像OP試圖 – Stephan

1

做的另一種方式: -

SELECT UsersRank 
FROM 
(
    SELECT userinfo.score, userinfo.username, @Rank:[email protected]+1 AS UsersRank 
    FROM userinfo 
    CROSS JOIN (SELECT (@Rank:=0)) Sub1 
    ORDER BY userinfo.score DESC, userinfo.username 
) Sub2 
WHERE username = 'boddie' 
+0

+1不錯的選擇 – Stephan

0

試試這個。

SELECT (COUNT(*)+1) AS rank 
FROM userinfo ui 
WHERE ui.score > (SELECT score 
        FROM userinfo 
        WHERE username='boddie');