2010-05-11 46 views
1

我有了兩個字段一個scores表:如何根據字段獲得行數相對於總行數的等級?

  • USER_ID
  • 得分

我獲取匹配的user_id的列表是特定行。我如何根據score來確定每行相對於總行數的排名?結果集中的行不一定是連續的(分數將在一行到下一行之間變化很大)。我不確定這是否重要,但user_id是一個獨特的領域。

編輯

@Greelmo

我已經下令行。如果我取15行,我不希望等級爲1-15。我需要它是該行與屬性對整個表進行比較的位置。所以如果我有200行,一行的排名可能是3,另一行可能是179(這些是任意#的例子只)。

編輯2

我有一些運氣與此查詢,但其實我是想避免關係

SELECT 
     s.score 
     , s.created_at 
     , u.name 
     , u.location 
     , u.icon_id 
     , u.photo 
     , (SELECT COUNT(*) + 1 FROM scores WHERE score > s.score) AS rank 
    FROM 
     scores s 
    LEFT JOIN 
     users u ON u.uID = s.user_id 
    ORDER BY 
     s.score DESC 
     , s.created_at DESC 
    LIMIT 15 

如果兩個或多個行具有相同的分數,我想要最新一個(或者最早 - 我不在乎)排在更高的位置。我試圖用AND id > s.id修改子查詢,但最終給了我一個意想不到的結果集和不同的關係。

回答

1
Select S.score, S.created_at, U.name 
    , U.location, U.icon_id, U.photo 
    , (Select Count(*) + 1 
     From scores S2 
     Where S2.score > S.score 
      Or (S2.score = S.Score And S2.created_at > S.created_at) 
     ) AS rank 
From scores S 
    Left Join users U 
     On U.uID = S.user_id 
Order By S.score DESC, S.created_at DESC 
LIMIT 15 

當然,如果有可能的兩個分數具有相同的created_at日期,那麼你仍然會得到聯繫,並需要確定第三決勝。

+0

這很好,謝謝! – 2010-05-11 17:10:13

0

您可以在查詢中訂購數據。

SELECT user_id, score FROM table ORDER BY score ASC; 

這會給你從最低分到最高分的數據。

如果這不能回答你的問題,那麼我不明白你在問什麼。

編輯

爲了得到這個職位,同時通過數據庫結果迭代,只保留一個計數器。

+0

請看我的編輯:) – 2010-05-11 06:13:26

相關問題