PHP排名和更新所有数据库行

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

尝试对我的表中的行进行排名,然后使用其排名编号更新每行中的字段。排名将基于具有分值的字段

数据库结构如下:

表名:博客

字段:ID、buildpointsNow、build\u rank

我想运行一个cron作业,该作业将根据其buildpointsNow值对每一行进行排序,然后使用该排名编号更新其build\u排名

到目前为止,我已经尝试:

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)