我有一个排名板,列出了每种性别(男性和女性)的前 100 个最佳博客。
我有一个博客表:
PRIMARY
blogs_id users_id blogs_score blogs_score_time gender
1 11 2852 2015-09-09 05:21:51 m <-- same score but older date
2 23 2146 2015-09-10 07:31:54 m
3 23 2146 2015-09-10 07:32:26 m
4 23 2852 2015-09-10 04:42:15 m <-- same score but newer date
5 51 1793 2015-09-11 08:15:55 f
6 88 2947 2015-09-11 09:33:18 f
我有一个用户表:
PRIMARY
id best_rank gender
11 0 m
23 0 m
51 0 f
88 0 f
我需要计算每个用户的最佳排名(使用 MAX(blogs_score) 和 MAX(blogs_score_time))博客表并插入/更新用户表每个性别的前 100 位排名最高的用户的排名最高,因此结果应该是:
PRIMARY
id best_rank gender
11 2 m
23 1 m
51 2 f
88 1 f
其中,用户 id 11 的最佳排名为 2,因为用户 id 11 与用户 23 的得分相同,但日期比用户 23 更早。其中,由于女性组,用户 51 的排名为 2。我已添加栏目blogs_score_time
以防止平局排名。日期 2015-09-10 表示 9 月 10 日。
最终的想法是在用户个人资料中显示排名位置,一旦有人投票(blogs_score
博客表中的更改),best_rank
栏目中的users
必须使用新的排名重新计算来更新表ALL特定性别组中排名最高的 100 位用户。
如何根据我的需要调整和修复此(不起作用)查询?
$sql->query("UPDATE users
JOIN (SELECT b.users_id,
@curRank := @curRank + 1 AS rank,
MAX(blogs_score), MAX(blogs_score_time)
FROM blogs b
JOIN (SELECT @curRank := 0) r
ORDER BY b.blogs_score DESC, p.blogs_score_time DESC LIMIT 100
) ranks ON (ranks.users_id = users.id)
SET users.best_rank = ranks.rank");
或者如何适应和修复这个(不起作用)查询
$sql->query("INSERT INTO users (best_rank, id)
SELECT @rank := @rank + 1 AS rank, b.users_id
FROM blogs b
LEFT JOIN users u ON b.users_id = u.id
GROUP BY b.users_id, b.blogs_score, b.blogs_score_time, b.gender
ORDER BY b.blogs_score DESC, b.blogs_score_time DESC
ON DUPLICATE KEY UPDATE best_rank = VALUES(rank)");
请帮我解决这个问题。我在stackoverflow上没有找到任何类似的解决方案,单独编写这样的查询对我来说似乎非常复杂。
预先非常感谢!