PHP排名和更新所有数据库行
尝试对我的表中的行进行排名,然后使用其排名编号更新每行中的字段。排名将基于具有分值的字段 数据库结构如下: 表名:博客 字段:ID、buildpointsNow、build\u rank 我想运行一个cron作业,该作业将根据其buildpointsNow值对每一行进行排序,然后使用该排名编号更新其build\u排名 到目前为止,我已经尝试:PHP排名和更新所有数据库行,php,mysql,sql,pdo,ranking,Php,Mysql,Sql,Pdo,Ranking,尝试对我的表中的行进行排名,然后使用其排名编号更新每行中的字段。排名将基于具有分值的字段 数据库结构如下: 表名:博客 字段:ID、buildpointsNow、build\u rank 我想运行一个cron作业,该作业将根据其buildpointsNow值对每一行进行排序,然后使用该排名编号更新其build\u排名 到目前为止,我已经尝试: UPDATE blogs JOIN (SELECT p.id, @curRank := @curRank + 1 AS rank FRO
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;
这两种方法都不会抛出错误,并且会更新数据库行。但是,他们不会根据BuildPoints字段对构建排名进行排序。相反,它们会按其创建顺序/ID更新每一行
有什么想法吗?
在添加@curRank
之前,博客需要由buildpointsNow
订购:
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;
创建一个单独的表,并在其中存储排名顺序。您需要一个带有post\u id
的列和一个带有score
的列。每次从score
添加/减去分数时,请修改该列。当您需要按排名顺序显示帖子时,只需对第二个较轻的表进行排序,然后加入较重的表
还要确保为得分列编制索引。刚刚选中,实际上不会更新表。我的问题不正确,第一个示例也没有更新表。是否要修改第二个示例以使其正确工作?第二个示例确实更新了,但作为问题,只是没有按“点数”字段排序。@user2921557,很抱歉,我以前的解决方案中有输入错误。将blogs.build\u rank=blogs.build\u rank
更改为blogs.build\u rank=ranks.rank
非常好,这确实更新了表。但顺序似乎有些奇怪。例如,排名为“1”的博客有10分,而排名为4分的博客排名第17位,排名为303的博客排名第14位。关于这个有什么想法吗?@user2921557,对不起,我不能用你的解释来说明问题。你能添加一些样本数据吗?有可能buildpointsNow应该按降序排列吗?我想是的,但是没有。我会将样本数据作为ID(点,秩)来处理。1(142,6), 2(183,10), 5(101,2), 10(160,7), 15(75,22), 20(15,19), 25(18,9)