2010-01-28 2 views
5

У меня есть таблица под названием «рекорды», которая выглядит так.Отображение одного ранга в таблице MySQL

id  udid  name  score 
1  1111  Mike  200 
2  3333  Joe  300 
3  4444  Billy  50 
4  0000  Loser  10 
5  DDDD  Face  400 

Учитывая конкретный udid, я хочу вернуть ранг этой строки по их оценке.

т.е. если UDID данный = 0000 я должен вернуться 5.

Любая идея, как написать этот запрос для базы данных MySQL?

ответ

7

MySQL не имеет каких-либо аналитических/рейтинг функциональности, но вы можете использовать переменную, чтобы искусственно создать значение ранга:

SELECT t.id, 
     t.udid, 
     t.name, 
     t.score, 
     @rownum := @rownum + 1 AS rank 
    FROM HIGHSCORES t 
    JOIN (SELECT @rownum := 0) r 
ORDER BY t.score DESC 

Для того, чтобы увидеть, что ранг связан с UDID «0000», использование :

SELECT MAX(x.rank) AS rank 
    FROM (SELECT t.id, 
       t.udid, 
       t.name, 
       t.score, 
       @rownum := @rownum + 1 AS rank 
      FROM HIGHSCORES t 
      JOIN (SELECT @rownum := 0) r 
     ORDER BY t.score DESC) x 
WHERE x.udid = '0000' 

Нужен MAX в случае, если пользователь имеет несколько значений высокого балла. В качестве альтернативы вы не можете использовать MAX и использовать ORDER BY rank LIMIT 1.

+0

ааа спасибо, есть только одна запись в Удид, я позабочусь об этом в своем php-скрипте. также, я немного знал об этом. Итак, как работают два блока. Я помещаю их в один и тот же запрос? Или сразу после друг друга? – 2010-01-28 21:28:47

+0

@MichaelInno: Если вы проверяете только определенный рейтинг пользователей, вам нужно всего лишь использовать второй запрос. Замените '' 0000'' на любое 'udid', которое вы ищете. –

+0

Это даст вам разные ранги для пользователей с одинаковой оценкой. –

1

Повторим отличный ответ OMG, который является общим случаем множества высоких баллов в UDID, вот запрос основан на предпосылке точно одной записи в UDID:

SELECT rank 
FROM 
    (SELECT @rownum := @rownum + 1 AS rank, score, udid 
    FROM highscores 
    JOIN (SELECT @rownum := 0) r 
    ORDER BY highscores.score DESC) x 
WHERE x.udid = '0000'