2014-02-11 2 views
0

У меня есть база данных, которая имеет структуру, аналогичную структуре:Finding «ранг» входа в базу данных SQL эффективно

http://www.sqlfiddle.com/#!2/6c5239

В настоящее время в .php сценарии, чтобы найти ранг человека я бегу

и зацикливать результаты, прирастить "rank" изменять каждую строку до тех пор, пока я не нахожу желаемое имя, не выдаю результаты и не прерываю цикл.

Я считаю, что это очень неэффективный способ получить ранжирование, как для веб-сервера, для которого требуется прокрутка данных, так и для базы данных SQL для возврата всей таблицы.

Есть ли более простой способ сделать это, возможно, через инструкцию SQL, которая слишком не налагает на SQL-сервер слишком много?

+0

Я не уверен, что ваш метод является плохим. Но вы можете сделать это эффективно в SQL с помощью переменных для отслеживания рангов. – Strawberry

+0

Если вам не нужно делать {SELECT * FROM}, не используйте его. выберите столбцы, которые необходимо запросить, чтобы обеспечить скорость в базе данных. Я не могу сказать, нужно ли запрашивать все столбцы. – Mubo

ответ

0
select * from (
    select 
    p.*, 
    @rank:=IF(@prev_score != score, @rank + 1, @rank) as rank, 
    @prev_score := score 
    from 
    people p 
    , (select @rank:=1, @prev_score:=null) var_init 
    order by score desc 
) sq where rank = 5; 
  • увидеть его работы вживую в sqlfiddle

Это для MySQL. Ваш вопрос помечен как MySQL, но в вашем sqlfiddle вы указали SQL Server.

Для SQL Server это будет так:

; with cte as (
select 
p.*, 
rank() over (order by score desc) as my_rank 
from 
people p 
) select * from cte where my_rank = 5; 

UPDATE:

select * from (
    select 
    p.*, 
    @rank:=IF(@prev_score != score, @rank + 1, @rank) as rank, 
    @prev_score := score 
    from 
    people p 
    , (select @rank:=1, @prev_score:=null) var_init 
    order by score desc 
) sq where name = 'whatever'; 
+0

Неплохо, скрипт SQL должен быть исправлен. Ваш код работает, чтобы найти по рангу, но как я могу найти по имени пользователя и вернуть свой рейтинг? Например, я бы узнал, какой ранг «fred» относится ко всем другим записям (по результату). – johnnyb

+0

См. Обновленный ответ. – fancyPants

+0

Да, отлично, это работает! Спасибо, я ценю это. – johnnyb

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