2011-01-31 2 views

ответ

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

это действительно выглядит хорошим другом! – voldomazta

+0

отличный - если он работает, отметьте рядом с ответом, чтобы принять его. спасибо – RichardTheKiwi

+0

Это вернет x.5 для любого количества дубликатов «x». Если есть три дубликата, например «9», все они будут «9,5», а не «9.333 ...». Также может быть сделано без самоподключения. –

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

+0

Не уверен, что не является ответом, когда предоставляется действующий запрос, требования подтверждаются, но оставляются в ОП для дальнейшего уточнения. –

Смежные вопросы