2011-09-15 60 views
1

我想列出過去24小時內排名最高的WPM(每分鐘文字數)值的用戶。如果用戶有多個高分,則只應顯示最高分。我到目前爲止:Mysql:如何選擇最近24小時的排名前10位的用戶(並避免多個用戶輸入)

SELECT results.*, users.username 
FROM results 
JOIN users 
ON (results.user_id = users.id) 
WHERE results.user_id != 0 AND results.created >= DATE_SUB(NOW(),INTERVAL 24 HOUR) 
GROUP BY results.user_id 
ORDER BY wpm DESC LIMIT 10 

我的問題是,我的代碼沒有獲取最高值。例如:

用戶x有2個高分,但不是選擇此用戶的最高wpm的行,而是選擇具有較低值的行。如果我使用「MAX(results.wpm)」,我會得到最高的wpm。這會很好,但我也需要這一行的擊鍵。我的問題是,即使我提取正確的用戶,我也沒有收到該用戶的正確行(使用戶達到前10位的行)。

這是成績表:

ID | user_id | wpm |擊鍵| count_correct_words | count_wrong_words |創建

回答

0

感謝海洋,我覺得你的子查詢的方法是什麼給我的工作思路:(?)

的問題是,這GROUP BY選擇了第一列的聚集,我現在使用子查詢到第一階結果由wpm和我的操作使用此「tmp表」

SELECT t1.*, users.username 
FROM (SELECT results.* FROM results WHERE results.user_id != 0 AND results.created >= DATE_SUB(NOW(),INTERVAL 24 HOUR) ORDER BY wpm DESC) t1 
JOIN users ON (t1.user_id = users.id) 
GROUP BY t1.user_id 
ORDER BY wpm DESC 
LIMIT 10 

這似乎工作正常。

1

(編輯答案,因爲我們不能使用子查詢中LIMIT)

這裏的另一種嘗試......

SELECT users.username, R1.* 
FROM users 
JOIN results R1 ON users.userId = R1.userId 
JOIN (SELECT userId, MAX(wpm) AS wpm FROM results GROUP BY userId) R2 ON R2.wpm = R1.wpm AND R2.userId = R1.userId 
WHERE R1.user_id != 0 AND R1.created >= DATE_SUB(NOW(),INTERVAL 24 HOUR) 
ORDER BY R1.wpm DESC LIMIT 10; 

我們使用MAX()首先分離的最大WPM的每一個USER_ID ,然後將結果表與此子集結合以獲取完整的行信息。

+0

我已經試過,但我的MySQL版本「還不支持」限制&在/所有/任何/某些子查詢'「:( –

相關問題