MySQL:按字节顺序将字段设置为位置

时间:2011-08-10 17:09:10

标签: mysql ranking

我正在设计一个排行榜,我们会显示每个用户排名以及前一天的排名变化。只需通过points列对用户进行排序即可找到排名。

为了找到前一天的排名变化,我想我必须有一个cron作业,每天午夜存储用户排名。

是否可以编写此cron作业以仅使用一个SQL查询?我需要设计一个查询,在previousRank列中存储每个用户的排名。有帮助吗?我想在一定数量的查询中执行此操作,而不需要使用PHP处理每一行。

1 个答案:

答案 0 :(得分:3)

我的建议:

创建previous_points列,然后每晚发出此简单查询:

UPDATE table SET previous_points = points;

然后,要按当前或前一天显示排名,只需分别使用pointsprevious_points

修改

您可以使用临时表来使用此数据。

以下是一个例子:

1:制作一个填充了今天排名的临时表:

SET @rank := 0;
CREATE TEMPORARY TABLE ranks_today
    (id INT(8), rank INT(6), previous_rank INT(6))
    SELECT id, @rank:= @rank + 1 AS rank
    FROM users
    ORDER BY points DESC;

2:昨天排名的临时表:

SET @rank := 0;
CREATE TEMPORARY TABLE ranks_yesterday
    (id INT(8), rank INT(6))
    SELECT id, @rank:= @rank + 1 AS rank
    FROM users
    ORDER BY previous_points DESC;

3:为方便起见,我们现在将昨天的排名复制到今天的表中:

UPDATE ranks_today, ranks_yesterday
SET ranks_today.previous_rank = ranks_yesterday.rank
WHERE ranks_today.id = ranks_yesterday.id;

4:最后,显示用户姓名的查询,今天和昨天的排名以及变化:

SELECT u.name, t.rank, t.previous_rank, t.previous_rank - t.rank `change`
FROM ranks_today t, users u
WHERE u.id = t.id;

如果您愿意,可以在用户表格中创建rankprevious_rank列,并在步骤3中更新这些列。

以下是查询的示例输出:

name        rank    previous_rank    change
----        ----    -------------    ------
Fred        1       2                1
Betty       2       5                3
Barney      3       3                0
Bam Bam     4       1                -3
Wilma       5       4                -1