检索INSERT的第N个子查询

时间:2011-01-28 20:19:07

标签: mysql subquery

抽象

从持有各种用户帖子到论坛的表格中,另外一张表格每日更新前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张海报。我知道可以优化表结构。答案的焦点应该是如何确定子查询的当前检索行。

2 个答案:

答案 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

上设置auto_increment
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)
);

因此,排名是自动递增的(与每日帖子数下降的顺序相同)