从持有各种用户帖子到论坛的表格中,另外一张表格每日更新前20张海报。帖子存储在posts
,每日高分保存在hiscore
。
posts: post_id(PK:INT) | user_id(INT) | ... | timestamp(TIMESTAMP) hiscore: user_id(INT) | rank(INT)
TRUNCATE TABLE `hiscore` ;
INSERT INTO `hiscore` (`user_id`,`rank`)
(
SELECT `user_id`, ???
FROM `posts`
WHERE `timestamp` BETWEEN blah AND blah
GROUP BY `user_id`
ORDER BY COUNT(`post_id`) DESC
LIMIT 20
)
在上述查询中插入什么而不是???
来计算排名?
是否有像@NTH_SUBQUERY
这样的变量在SELECT
子查询的第五次运行中替换为5?
更新:表格hiscore
应仅持有前20张海报。我知道可以优化表结构。答案的焦点应该是如何确定子查询的当前检索行。
答案 0 :(得分:2)
INSERT INTO `hiscore` (`user_id`,`rank`)
(
SELECT `user_id`, @rank = @rank + 1
FROM `posts`, (SELECT @rank := 0) r
WHERE `timestamp` BETWEEN blah AND blah
GROUP BY `user_id`
ORDER BY COUNT(`post_id`) DESC
LIMIT 20
)
答案 1 :(得分:1)
对于你的情况
,truncate
似乎太花哨了
hiscore:
the_date (DATE) | user_id(INT) | rank(INT)
并在the_date, rank
<强>插入强>
set @pos=0;
insert into hiscore
select cur_date(), user_id, @pos:=@pos+1
from ...
要保持表格大小可管理,您可能会在几个月内删除一次
或者您可以在rank
create table hiscore
(
the_date date not null,
rank int(3) not null auto_increment,
user_id int(10) not null,
primary key (the_date, rank)
);
因此,排名是自动递增的(与每日帖子数下降的顺序相同)