2013-04-03 4 views
0

Что является самым простым способом с максимальной производительностью, чтобы определить «ранг» значения Integer внутри базы данных MySQL, содержащей> 100 000 записей.Узнайте «ранжирование» значения в базе данных SQL

Например, у меня есть таблица «оценки», с колонкой «ценность»

value 
50 
150 
10 
200 
180 

Ранг 150 в этом случае было бы 3, ранг 200 будет 1, ранг 10 будет 5 и т. д.

Какое выражение выглядит в php для определения «ранга» определенного значения?

+1

Вы хотите ранг (со связями) или номер строки? Вы можете сделать это с помощью определяемых пользователем переменных. – sgeddes

+1

Что вы пробовали? Есть много подобных вопросов в StackOverflow, которые могут предложить то, что вы ищете – thaJeztah

ответ

1

Если вы не заботитесь о связях, я бы сделал это так:

SELECT COUNT(*)+1 AS rank FROM scores WHERE value > $myScore 

в действии на SQL Fiddle.

+0

спасибо, это именно то, что я искал. Что касается производительности, если это заявление, так как я работаю с> 100.000 записей? –

+1

@a_horse_with_no_name это выглядит правильно для меня ... если нет дублированных оценок, но это зависит от OP – fthiella

0

select Value, RankNumber 
from (
    select Value, @RankNumber:= @RankNumber +1 as RankNumber 
    from table1, (select @RankNumber:=0) t 
    order by Value desc 
) A 
where A.Value = 180 

DEMO
Для беспокойства производительности, вы можете запустить тест, увидеть, если он может удовлетворить ваш бар.

0

Потому что я не знаю, если вы хотите номер строки или ранг (в том числе связи), здесь оба варианта с использованием user-defined переменных:

SELECT * 
FROM (
    SELECT value, 
     @rn:[email protected]+1 RowNumber, 
     @rank:=if((@value=value),@rank, @rn) rank, 
     @value:=value 
    FROM scores 
     JOIN (SELECT @value:=-1, @rn:=0, @rank:=0) t 
    ORDER BY value DESC 
    ) t 
WHERE value = 150 

SQL Fiddle Demo

Это отражает RANK() и ROW_NUMBER() в другой СУБД.

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