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

时间:2014-07-30 23:04:41

标签: php mysql sql pdo ranking

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

数据库结构如下:

表名:博客

字段: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来更新每一行。

有什么想法吗?

2 个答案:

答案 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;

Demo

答案 1 :(得分:0)

在那里创建一个单独的表并存储排名顺序。您需要一个post_id的列和一个score的列。每次从points添加/减去score时,都会修改该列。当你需要按排名顺序显示帖子时,只需对第二个较轻的表格进行排序并加入帖子较重的表格。

另外,请确保将score列编入索引。