我正在设计一个排行榜,我们会显示每个用户排名以及前一天的排名变化。只需通过points
列对用户进行排序即可找到排名。
为了找到前一天的排名变化,我想我必须有一个cron作业,每天午夜存储用户排名。
是否可以编写此cron作业以仅使用一个SQL查询?我需要设计一个查询,在previousRank
列中存储每个用户的排名。有帮助吗?我想在一定数量的查询中执行此操作,而不需要使用PHP处理每一行。
答案 0 :(得分:3)
我的建议:
创建previous_points
列,然后每晚发出此简单查询:
UPDATE table SET previous_points = points;
然后,要按当前或前一天显示排名,只需分别使用points
或previous_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;
如果您愿意,可以在用户表格中创建rank
和previous_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