MySQL дает игрокам звание между датами - PullRequest
1 голос
/ 10 июля 2011

У меня есть таблица игроков:

id  points  last_online
 1     320  2011-07-10
 2    1025  2011-07-05
 3     750  2011-04-25
 4    5000  2011-07-10
 5     525  2011-05-01

Для того, чтобы получить рейтинг игрока (на основе очков), у меня есть следующий выбор MySQL:

SELECT Player.*,
    ( SELECT COUNT(*)
      FROM players Player_i
      WHERE (Player_i.points, Player_i.id) >= (Player.points, Player.id)
     ) AS rank
FROM players AS Player
WHERE Player.id = 1

Это работаетхорошо.Итак, рейтинг для идентификатора игрока 1 равен 5.

Но я хочу рассмотреть только игроков, которые были онлайн в последний раз за последние 30 дней (учитывая, что сегодня 2011-07-10).Таким образом, ранг для ID игрока 1 будет 3, потому что игроки 3 и 5 были исключены из ранга.

Есть идеи, как мне это сделать?

Ответы [ 2 ]

3 голосов
/ 10 июля 2011

Два пути. Во-первых, немного отредактируйте ваш запрос:

SELECT Player.*,
    ( SELECT COUNT(*)
      FROM players Player_i
      WHERE Player_i.points >= Player.points
      and last_online > subdate(now(), '30 day')
     ) AS rank
FROM players AS Player
WHERE Player.id = 1
and last_online > subdate(now(), '30 day'); -- EDITED to add this line

Второй способ и лучший способ - использовать переменную (более высокую производительность и более простой SQL):

set @rank := 0;
SELECT *, @rank := @rank + 1
FROM Player
WHERE last_online > subdate(now(), 30 'day')
ORDER BY points desc;
1 голос
/ 10 июля 2011

Добавьте WHERE last_online > NOW() - '30 days' к вашему запросу:

SELECT Player.*,
    ( SELECT COUNT(*)
    FROM players Player_i
    WHERE (Player_i.points, Player_i.id) >= (Player.points, Player.id)
        AND Player.last_online >= SUBDATE(NOW(), '30 day')
    ) AS rank
FROM players AS Player
WHERE Player.id = 1
    AND Player.last_online >= SUBDATE(NOW(), '30 day');
...