我有一个表格,其中包含字段ID,投票(对于每个用户),评级。
任务:根据他和其他人的投票计算用户评分。也就是说,每次我更新字段投票所需的重新计算字段评级。
这意味着有些人可能排在第3位。投票支持他,并且他将站到第2位,而另一个反过来 - 从2到3.(评级为fiels)
如何解决这个问题?每次更新字段以计算用户对php的评级并在mysql中进行大量更新查询非常昂贵。
答案 0 :(得分:1)
这取决于很多因素
如果所有答案都是否,那么您当前的更新方法就可以了。无论如何,请确保您应用最佳编码和MySQL表格实践。
假设您的大部分或全部答案都是是,那么我建议如下:
INSERT
记录到您的表格中INSERT
,添加时间戳,如果不可能,则添加用户ID,然后可能是IP地址/位置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
这为您提供了一个可以忽略的额外列,或者您可以将此选择包装到子查询中并具有:
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