Понимание функционирования ранга в MySQL

Я пытаюсь понять плотный ранг, используя переменные в MySQL.

Я создал таблицу как:

create table scores (id int,score float);

Вставленные значения как это:

insert into scores values(1,3.50);
insert into scores values(2,3.65);
insert into scores values(3,4.00);
insert into scores values(4,3.85);
insert into scores values(5,4.00);
insert into scores values(6,3.65);

Запрос, который я написал для ранжирования таблицы, используя оценку следующим образом:

set @rank=0;
set@score='';
select score,
   (@rank := if(@score = score, 
                @rank, 
                if(@score := score,    
                   @rank+1, 
                   @rank                    
                  )
               )                  
   ) as rank
from scores  
order by score desc;

Когда я выполнял запрос "без" по порядку счета, результат был примерно таким:

score   rank 
3.5     1
3.65    2
4       3
3.85    4
4       5
3.65    6

Когда я выполнил запрос "с" упорядочить по счету desc, я получил вывод, и это примерно так:

score   rank
4       1
4       1
3.85    2
3.65    3
3.65    3
3.5     4

Что происходит внутри при использовании фрагмента ниже?

select score,
   (@rank := if(@score = score, 
                @rank, 
                if(@score := score,    
                   @rank+1, 
                   @rank                    
                  )
               )                  
   ) as rank
from scores 

1 ответ

Ваш алгоритм ранжирования в основном просто сравнивает счет каждой строки со счетом предыдущей строки или '' (для первой строки). Если счет одинаковый, он возвращает тот же ранг, если счет изменился, он увеличивает ранг на единицу.

РЕДАКТИРОВАТЬ

Кстати, это происходит после упорядочивания набора результатов.

Другие вопросы по тегам