尝试对表格中的行进行排名,然后使用其排名编号更新每行中的字段。排名将基于具有分值的字段。
数据库结构如下:
表名:博客
字段:ID,buildpointsNow,build_rank
我想运行一个cron作业,根据其buildpointsNow值对每行进行排名,然后使用该等级数更新其build_rank。
到目前为止,我已尝试过:
UPDATE blogs
JOIN (SELECT p.id,
@curRank := @curRank + 1 AS rank
FROM blogs p
JOIN (SELECT @curRank := 0) r
ORDER BY p.buildpointsNow DESC
) ranks ON (ranks.id = blogs.id)
SET blogs.build_rank = blogs.build_rank;
还有:
update blogs cross join
(select @rn := 0) vars
set build_rank = (@rn := @rn + 1);
order by buildpointsNow;
这两个都没有错误,并且更新了数据库行。但是,它们不会根据buildpointsNow字段对构建等级进行排序。而是按照创建顺序/ ID来更新每一行。
有什么想法吗?
答案 0 :(得分:1)
blogs
之前,需要buildpointsNow
订购 @curRank
:
update blogs
join (
select p.id, @curRank := @curRank + 1 as rank
from (select id from blogs order by buildpointsNow) p
join (select @curRank := 0) r) ranks on ranks.id = blogs.id
set blogs.build_rank = ranks.rank;
答案 1 :(得分:0)
在那里创建一个单独的表并存储排名顺序。您需要一个post_id
的列和一个score
的列。每次从points
添加/减去score
时,都会修改该列。当你需要按排名顺序显示帖子时,只需对第二个较轻的表格进行排序并加入帖子较重的表格。
另外,请确保将score
列编入索引。