如何实施一个评级系统,该系统还支持查询评分最高的“今天,周,月”

时间:2011-07-26 17:54:11

标签: php sql rating

我一直在网上寻找一些好的评级系统教程,我似乎无法找到我正在寻找的那个! 我遇到过这篇文章http://www.expertcore.org/viewtopic.php?f=74&t=1451,它使用了贝叶斯评级算法和类似/不喜欢的评级,而且这是我想要的评级系统,除了系统只能制作“有史以来评分最高的列表”,我希望能够做出“今天最受好评”,“本周评分最高”和“本月评分最高”等。我不确定我将如何解决这个问题,因为我在数据库设计方面并不擅长,而且我不想在以后遇到性能问题!

示例我有这三个表。

表“项目” ID 名称

表“用户” ID 名称

表“投票” ID ITEMID 用户身份 日期

正常的算法是这样的: br =((avg_num_votes * avg_rating)+(this_num_votes * this_rating))/(avg_num_votes + this_num_votes)

因此,要获得有史以来最高评分的列表,我必须为每件物品计算BR。这是否意味着如果我想要本月最受好评的名单我只是做同样的但是检查投票的日期是否有效?请给我提示和提示!

1 个答案:

答案 0 :(得分:2)

您的表看起来会起作用,您只需要选择在日期范围内发生的所有投票记录。因此,对于“本周”,对于所有该等式中的值,您可以在选择仅选择本周中的行时应用日期过滤器。

For:avg_num_votes,avg_rating,this_num_votes,this_rating;所有这些都需要根据“本周”的记录创建,否则你的权重将会偏离,而你的“本周最高”只会显示所有时间的记录。

与“本月最高评分”和“今日最高评分”相同,您只是希望看到在该时间范围内投票的投票,并且不会考虑所有投票。

对于速度,您可能希望在数据库级别尽可能多地过滤,这可能意味着加入项目和投票表,然后仅选择投票日期在您想要的范围内,然后工作有了这些数据。

他自己的代码可以很好地证明这一点,只需在他的select语句中添加一个过滤器:

$result = mysql_query(”SELECT AVG(item),AVG(vote) FROM itemvotes WHERE vote>’0’ GROUP BY item AND date BETWEEN '2010-08-20' AND '2010-08-21'”) or die(mysql_error());

// this item votes and ratings
$result = mysql_query(”SELECT COUNT(item),AVG(vote) FROM itemvotes WHERE item=’$theItem’ AND vote>’0’ AND date BETWEEN '2010-08-20' AND '2010-08-21'”) or die(mysql_error());

这可能不完全一样(或根本不起作用,这个例子有点时髦),但它表明了我的意思。