1

我有一张玩家表:

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

它工作正常。因此,玩家 ID 1 的排名为 5。

但我想只考虑过去 30 天内上次在线的玩家(考虑今天是 2011-07-10)。这样,玩家 ID 1 的排名将是 3,因为玩家 3 和 5 被排除在排名之外。

知道我该怎么做吗?

4

2 回答 2

3

两种方式。第一种方法,稍微编辑您的查询:

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;
于 2011-07-10T12:04:49.433 回答
1

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');
于 2011-07-10T12:02:45.987 回答