2013-04-17 70 views
1

目前在遊戲桌以下信息查詢查找用戶排名在遊戲數據庫

ID  Name  XP 
1  Bob  11 
2  Jim  120 
3  Dan  56 
4  Oli  32 

我想拉例如單個用戶時,發現軍銜。例如,我希望能夠將'Jim'作爲等級編號1,將'Bob'等級編號爲4。

我有這個查詢,但它似乎很亂。

SELECT COUNT(*)+2 FROM game WHERE xp > (SELECT xp FROM game WHERE id = '$id') 
+2

你的查詢看起來不錯,但爲什麼'+ 2'而不是'+ 1'? – Quassnoi

回答

2

你可以使用這樣的事情:

SELECT g1.id, COUNT(DISTINCT g2.XP)+1 rank 
FROM 
    game g1 LEFT JOIN game g2 
    ON g1.XP < g2.XP 
GROUP BY 
    g1.id 

小提琴here。您可以使用DISTINCT或不使用DISTINCT,具體取決於您以後的內容。

+0

這是正確的答案。你會想要一個在XP上的INDEX。 – JRL

+0

我犯了一個愚蠢的錯誤 - 這工作完美,將接受,當我可以:) – okett

+1

確保你接受他的答案,當你可以讓其他人發現這個條目知道它的工作。 – JRL

0

您可能想要填充數組以找到其「排名」。如果您只是想最高:

"SELECT * FROM game WHERE xp = MAX(xp)" 

如果你想通過自己的排名在XP訂購了表,我建議使用填充數據的數組,因此您可以通過XP和排序它然後相應地提供它。我還使用了$ DB類在我的劇本,但它應該是有意義:

while($data = $db->sql_query("SELECT * FROM games ORDER BY xp DESC"){ 
    $rank++; 
    $users[]['name'] = $data['name']; 
    $users[]['xp'] = $data['xp']; 
    $users[]['rank'] = $rank; 
} 

echo '<table><tr><td>Rank</td><td>Name</td><td>XP</td></tr>'; 

foreach($users as $user){ 
    echo'<tr><td>'.$user['rank'].'</td><td>'.$user['name'].'</td><td>'.$user['xp'].'</td></tr>'; 
} 

echo '</table>'; 

在我的經驗,它一直是容易應付的信息,如果你只是填充數組。在我缺少的sql查詢語法中可能會有一些技巧,但它會完成工作。