2013-06-21 44 views
2

我試圖從SQL select中排列點數,但是隻有當點數與返回結果中的其他點不相關時。只有當結果不相同時,MySQL行選擇纔會增加

的SQL查詢我使用:

SET @rank=0; 
SELECT *, @rank:[email protected]+1 AS rank FROM points; 

這很簡單! ,並顯示以下結果:

id | user_id | points | rank 
---------------------------- 
2 | 133845 | 220 | 1 
3 | 134084 | 220 | 2 
4 |  1 | 150 | 3 
5 | 134086 | 145 | 4 
6 | 134080 | 100 | 5 
7 | 17938 | 30 | 6 
8 | 83011 | 20 | 7 
9 |  26 | 5 | 8 
10 | 134077 | 5 | 9 
11 | 134074 | 5 | 10 

正如你可以看到ID 2和3分的相同金額等做ID 9,10,和11。因此從技術等級應該都是一樣的而不是繼續增加。

這下面的例子是怎樣的表應該正確地看:

id | user_id | points | rank 
---------------------------- 
2 | 133845 | 220 | 1 
3 | 134084 | 220 | 1 
4 |  1 | 150 | 2 
5 | 134086 | 145 | 3 
6 | 134080 | 100 | 4 
7 | 17938 | 30 | 5 
8 | 83011 | 20 | 7 
9 |  26 | 5 | 8 
10 | 134077 | 5 | 8 
11 | 134074 | 5 | 8 

我認識到,不斷遞增的等級上的選擇(使用@等級+ 1),每行不這樣做的理想方式。那麼,如何才能在點數不同的情況下進行特定增量?

+2

從[這個答案](http://stackoverflow.com/questions/7840745/mysql-query-to-dynamic-ranking-rows#answer-7854813):'@rank:= IF(@prev = @curr ,@rank,@ rank + 1)AS rank' –

回答

1

因此,有效的解決方案最終被:

SET @rank=0; 
SET @curr=0; 
SELECT *, 
    @prev := @curr, 
    @curr := points.points, 
    @rank := IF(@prev = @curr, @rank, @rank+1) AS rank 
FROM points; 

感謝很多領導我到正確的方向喬治!

相關問題