2014-02-10 209 views
-2

我想從我的數據集中獲得每週排名類型的結果,並且失敗了多種技術。按周排名按排名排序

我的數據是這樣的:

+------------+------+--------+ 
| team  | week |points | 
+------------+------+--------+ 
| blue  | 1 | 10  | 
| green  | 1 | 15  | 
| red  | 1 | 16  | 
| blue  | 2 | 5  | 
| green  | 2 | 18  | 
| red  | 2 | 6  | 
| blue  | 3 | 2  | 
| green  | 3 | 8  | 
| red  | 3 | 8  | 
+------------+------+--------+ 

,我試圖讓這樣的事情:

+------------+------+--------+ 
| team  | week | rank | 
+------------+------+--------+ 
| blue  | 1 | 3  | 
| green  | 1 | 2  | 
| red  | 1 | 1  | 
| blue  | 2 | 3  | 
| green  | 2 | 1  | 
| red  | 2 | 2  | 
| blue  | 3 | 3  | 
| green  | 3 | 1  | 
| red  | 3 | 1  | 
+------------+------+--------+ 

您可以在3個星期的點是綁看到的,所以等級需要也被綁定。平局排名將始終是值中的較低者。 (即聯合第二名總是等級2 2而不是3 3)。

它可以是一個存儲過程,視圖,任何東西。但它需要是MySql。

我有這個至今:

SELECT team, 
@rnk:= CASE 
    WHEN @week_id <> week THEN 0 
    WHEN points = @tot THEN @rnk 
    ELSE @rnk+1 
END 
AS rank, 
@week_id := week AS wk, 
@tot := points AS pts 
FROM 
    (SELECT @rnk:= -1) s, 
    (SELECT @week_id:= -1) c, 
    (SELECT * 
    FROM v_weeklypointtotals 
    ORDER BY week, points DESC 
) t 

不過,從MySQL工作臺調用時它的偉大工程。但是,當通過PHP調用時,會產生不正確的結果(它沒有考慮周平均數)。我認爲這可能與變量設置的順序有關......但我很難過。

+0

能你顯示一個或兩個失敗的嘗試? – Dukeling

+0

你應該看看SO中的舊帖子。看到這裏 - http://stackoverflow.com/questions/3333665/mysql-rank-function – DhruvJoshi

+0

請檢查我的答案是否對你有幫助。 – DhruvJoshi

回答

3

試試這個:

select team,week, 
(select count(*)+1 from Table1 where week=t1.week 
           and points >t1.points) as rank 
FROM Table1 t1 

SQLFiddle demo

+0

這是100%簡單,並發現。謝謝。 –

-1

順便說一句,如果你沒有費心尋找到SO職位,我在評論鏈接,你可以試試這個魔法:)

SELECT ( 
      CASE Week 
      WHEN @curW 
      THEN @curRow := @curRow + 1 
      ELSE @curRow := 1 AND @curW := Week END 
     ) + 1 AS rank, 
      Week, 
      team, 
      points 
FROM  tablename, 
      (SELECT @curRow := 0, @curW := 0) r 
ORDER BY Week DESC, points DESC; 
+0

它不考慮綁定情況 –