2011-01-31 48 views
1

比方說,我在下面的表格有:複雜的MySQL排名查詢與領帶

id | name | points 
------------------- 
1 | joe | 100 
2 | bob | 95 
3 | max | 95 
4 | leo | 90 

我能產生相反的排名記錄,像這樣:

id | name | points | rank 
-------------------------- 
4 | leo | 90  | 1 
3 | max | 95  | 2.5 
2 | bob | 95  | 2.5 
1 | joe | 100 | 4 

回答

1

這是一個完全工作的例子,這個示例表

create table tpoints (id int, name varchar(10), points int); 
insert tpoints values 
(1 ,'joe', 100), 
(2 ,'bob', 95 ), 
(3 ,'max', 95 ), 
(4 ,'leo', 90 ); 

MySQL查詢

select t.*, sq.`rank` 
from 
(
    select 
     points, 
     @rank := case when @g = points then @rank else @rn + (c-1)/2.0 end `rank`, 
     @g := points, 
     @rn := @rn + c 
    from 
     (select @g:=null, @rn:=1) g, 
     (select points, count(*) c 
     from tpoints 
     group by points 
     order by points asc) p 
) sq inner join tpoints t on t.points = sq.points 
order by t.points asc; 

它也有表現很好相比,執行相關的雜交(自交)的利益聯結。

  • 1X穿過tpoints聚集成團
  • 與領帶
  • 1X加入到表把隊伍對記錄計算排名。
0

不會做「2.5」作爲等級值,但重複將具有相同的號碼,如果你使用:

SELECT x.id, 
     x.name, 
     x.points, 
     (SELECT COUNT(*) 
      FROM YOUR_TABLE y 
      WHERE y.points <= x.points) AS rank 
    FROM YOUR_TABLE x 
ORDER BY x.points 
+0

如果它不會提供答案,爲什麼要提出這個答案? – RichardTheKiwi 2011-01-31 11:16:50

+0

當提供正常運行的查詢時,不確定什麼不是答案,要求已得到確認,但留給OP進一步澄清。 – 2011-01-31 15:44:50