2012-08-25 46 views
1

我正在製作一個系統,用戶通過網站上的某些操作獲得成就。我在使用mysql的成就排名時遇到問題

數據庫分爲三個,用戶,成績和表中的兩個鏈接。

對於排名,重要的是鏈接用戶和成就的表。 結構是這樣的(稱爲user_achievements):

| id | user_id | achievement_id | created_at | updated_at | 

在世界排名應該是最成就的人,誰贏得了第一。

是組裝查詢:

SELECT user_id, 
     COUNT(achievement_id) AS 'total', 
     created_at 
FROM `user_achievements` 
GROUP BY user_id ORDER BY total DESC, created_at ASC LIMIT 10 

此查詢的工作,但問題是「分組依據」對誰擁有最多的成就(爲「總」),它不會備份的最後一個created_at用戶。來到第一個created_at那個用戶,這不適合誰是第一個獲得這些成就的人。

我的系統使用Ruby on Rails,有沒有解決這個ActiveRecord中的查詢,會有很大的幫助。

非常感謝! 對不起,我的英語...

+0

其推薦的做法是隻選擇按字段和聚合函數分組。 您剛剛created_at的投影是錯誤的 – rshetye

回答

3
SELECT user_id, 
     COUNT(achievement_id) AS 'total', 
     MAX(created_at) as 'lastTS' 
FROM `user_achievements` 
GROUP BY user_id 
ORDER BY total DESC, lastTS ASC LIMIT 10 
1

我知道你已經選擇了你的答案,但如果你仍然想在ActiveRecord的一個解決方案...

class User < ActiveRecord::Base 
    scope :ranked, order('achievements.count DESC, achievements.created_at ASC').limit(10) 
end 

然後你只需要撥打Users.ranked@users.ranked即可獲得您需要的回報。