摘要
从一个包含用户各种帖子的表格到一个论坛,另一个表格每天更新前 20 名的帖子。帖子存储在posts
中,每日高分保存在hiscore
中。
表格
posts: post_id(PK:INT) | user_id(INT) | ... | timestamp(TIMESTAMP) hiscore: user_id(INT) | rank(INT)
Query
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 名发帖者。我知道表结构可以优化。答案的重点应该放在如何确定子查询的当前检索行上。
最佳答案
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
)
关于mysql - 检索 INSERT 的第 N 个子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4832668/