用户评分更新,重新计算

时间:2012-09-21 16:24:06

标签: php mysql

我有一个表格,其中包含字段ID,投票(对于每个用户),评级。

任务:根据他和其他人的投票计算用户评分。也就是说,每次我更新字段投票所需的重新计算字段评级。

这意味着有些人可能排在第3位。投票支持他,并且他将站到第2位,而另一个反过来 - 从2到3.(评级为fiels)

如何解决这个问题?每次更新字段以计算用户对php的评级并在mysql中进行大量更新查询非常昂贵。

5 个答案:

答案 0 :(得分:1)

这取决于很多因素

  1. 您是否有一个指数级增长的大型系统?
  2. 您是否需要历史报告的投票数据?
  3. 用户在投票时是否需要注册?
  4. 在整个系统生命周期中,此系统是仅用于一种投票类型还是会对不同的主题进行更多投票?
  5. 如果所有答案都是,那么您当前的更新方法就可以了。无论如何,请确保您应用最佳编码和MySQL表格实践。

    假设您的大部分或全部答案都是,那么我建议如下:

    • 每次投票INSERT记录到您的表格中
    • 使用INSERT,添加时间戳,如果不可能,则添加用户ID,然后可能是IP地址/位置
    • 从vote_subject表中将主题ID指定为外键。在此表中存储投票的主题和日期
    • 现在您可以创建一个SELECT语句,可以计算投票数并计算评分。投票计数列表的人员将在SELECT中获得评分1。此外,您可以按每个用户每天按用户进行过滤,您还应该能够根据所需的结果确定音量。

    所有这些当然取决于您的系统将来如何扩展。这可能是一种矫枉过正,但需要考虑的事情。

答案 1 :(得分:1)

如果您想在没有评级栏的情况下获得评分,那就是这样。但从性能角度来看,我无法保证这将是您的最佳选择。它的工作方式是,如果两个用户拥有相同数量的投票,他们将具有相同的评级,然后它将跳过下一个不同评级所需的数字:

set @rating:=0;
set @count:=1;

select id,
case when @votes<>votes then @rating:=@rating+@count
else @rating end as rating,
case when @votes=votes then @count:=@count+1
else @count:=1 end as count,
@votes:=votes as votes
from t1
order by votes desc

sqlfiddle

这为您提供了一个可以忽略的额外列,或者您可以将此选择包装到子查询中并具有:

select t2.id,t2.votes,t2.rating from (
select id,
case when @votes<>votes then @rating:=@rating+@count
else @rating end as rating,
case when @votes=votes then @count:=@count+1
else @count:=1 end as count,
@votes:=votes as votes
from t1
order by votes desc) as t2

但是sqlfiddle奇怪地给出了不一致的结果,所以你必须做一些测试。如果有人知道为什么这是我有兴趣知道原因。

如果您只想获得一个用户的评分,那么执行子查询选项并在where之后使用from可以获得所需的结果。 sqlfiddle - 但是,结果不一致,运行几次,有时它给出的评分为10次,为30次。我认为在你的数据库中测试看看会发生什么是最好的。

答案 2 :(得分:0)

我建议在查询数据时执行此操作。这会简单得多。按投票顺序递减。

也许在查询数据时创建一个视图并使用该视图。

您可以尝试这样的事情:

SET @rank := 0

select id, count(*) as votes, @rank := @rank + 1
from users
group by id
order by votes desc

或者

SET @rank := 0

select id, votes, @rank := @rank + 1
from users
order by votes desc

答案 3 :(得分:0)

不要使用字段ID,投票和评级,而是将表更改为包含字段id,rating_sum和rating_count。每当您有新的评级时,您都会像这样查询数据库:

    "UPDATE `ratings` SET `rating_count` = `rating_count` + 1, `rating_sum` = `rating_sum`+ $user_rating WHERE `id` = $id"

现在评分只是平均值 - &gt; rating_sum / rating_count。无需拥有评级字段。

此外,为了防止用户使用率超过一次,您可以创建一个名为rating_users的表,其中包含2个外键users.id和ratings.id。主键是(users.id,ratings.id)。因此,每次用户尝试先评价时,请检查此表格。

答案 4 :(得分:0)

是汇总是昂贵的。您可以每五分钟更新一次排名表并从那里查询。您现在可能已经查询的是:

select id, count(*) as votes
from users
group by id
order by votes desc