Отображение одного ранга в таблице MySQL - PullRequest
5 голосов
/ 29 января 2010

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

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?

Ответы [ 2 ]

7 голосов
/ 29 января 2010

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.

1 голос
/ 29 января 2010

Чтобы повторить превосходный ответ 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'
...