2012-08-01 64 views
2

我在Mysql中有一個複雜的場景。我的表結構和數據看起來象下面這樣:如何在Mysql中生成排名?

Field_a Field_b Field_c Total Rank 
------- ------- ------- ----- ---- 
1.2  1.1  3.9  6.2  1 
1.2   0   0  1.2  4 
1.2  1.1   0  3.3  3 
1.2   0  3.9  5.1  2 
1.2   0  3.9  5.1  2 
1.2   0   0  1.2  4 

領域,「總」和「排名」不存在的,我不得不產生他們,而查詢到數據庫中。有什麼辦法可以檢索mysql中的Rank嗎?

問候 Dolendra

+0

存儲過程,可以使隊伍以便ü不不得不查詢它 – 2012-08-01 10:00:27

回答

2
set @N:=0; 
select *,@N:[email protected]+1 as Rank from 
(
select Field_a , Field_b , Field_c, Field_a + Field_b + Field_c as total 
from table 
) as t 
order by total desc 
+0

是不是'row_number()'equivilent,而不是'rank()'或者'dense_rank()'equivilent?該運動員希望排列1,2,2,3,4,4',因爲這似乎會返回'1,2,3,4,5,6'? – MatBailie 2012-08-01 10:20:47

0

我認爲這是你在找什麼:

SELECT Field_a, Field_b, Field_c, 
     IF((Field_a + Field_b + Field_c) <> @var_total_prev, 
      (@var_rank:= @var_rank + 1), 
      @var_rank) AS rank, 
     (@var_total_prev := (Field_a + Field_b + Field_c)) AS total 
FROM my_table a,(SELECT @var_rank := 0, @var_total_prev := 0) r 
ORDER BY total DESC; 
+0

一切都沒問題,直到我們改變*按總量*順序*按字段順序排列**,**按字段順序排列* – user1568222 2012-08-01 11:38:41

+0

ya @Devart的答案將保留您提到的相同順序。唯一的區別是我沒有使用子查詢,所以性能明智更好。 – Omesh 2012-08-01 11:43:02

2

嘗試此查詢 -

SELECT t1.Field_a + t1.Field_b + t1.Field_c AS total, t2.rank FROM table5 t1 
    JOIN (SELECT total, @r:= @r + 1 rank FROM (SELECT Field_a + Field_b + Field_c AS total FROM table5 GROUP BY total DESC) t1, (SELECT @r:=0) t2 ORDER BY total DESC) t2 
    ON t1.Field_a + t1.Field_b + t1.Field_c = t2.total 
+0

+1:與此處的另一個答案相同的方法,只有一個關鍵區別。它給出了OP要求的結果;) – MatBailie 2012-08-01 10:23:34

+0

@Dems:在這種情況下,行的順序通過使用與派生秩表的連接來保留。 – Omesh 2012-08-01 10:27:18