我有兴趣使用这个
ranking class,基于
Evan Miller的一篇文章来排名我有一个有upvotes和downvotes的表.我有一个非常类似Stack Overflow的上/下投票系统的系统,用于我正在处理的事件站点,通过使用这个排名类,我觉得结果会更准确.我的问题是如何通过功能’hotness’订购?
private function _hotness($upvotes = 0,$downvotes = 0,$posted = 0) { $s = $this->_score($upvotes,$downvotes); $order = log(max(abs($s),1),10); if($s > 0) { $sign = 1; } elseif($s < 0) { $sign = -1; } else { $sign = 0; } $seconds = $posted - 1134028003; return round($order + (($sign * $seconds)/45000),7); }
我想每次用户投票我都可以在我的表中有一个列,其中包含为新投票重新计算的热度数据,并按主页上的该列排序.但我有兴趣在运行中加入上述功能,我不确定这是否可行.
来自Evan Miller,他使用:
SELECT widget_id,((positive + 1.9208) / (positive + negative) - 1.96 * SQRT((positive * negative) / (positive + negative) + 0.9604) / (positive + negative)) / (1 + 3.8416 / (positive + negative)) AS ci_lower_bound FROM widgets WHERE positive + negative > 0 ORDER BY ci_lower_bound DESC;
你是对的,像这样的查询相当混乱和昂贵.
原文链接:https://www.f2er.com/php/137459.html混合使用PHP / MysqL是一个坏主意,因为您必须为所有帖子选择值并计算热度,然后选择最热门的列表.非常昂贵.
您应该考虑将至少部分计算保存到数据库中.绝对订单应该去数据库.计算某些内容总是更好,每次保存/更新只保存一次,而不是计算每次显示时间.尝试通过计算保存/更新的顺序而不是每次计算热度来对保存时间进行基准测试.好的是订单永远不会改变,除非有人支持/ downvotes你保存到数据库无论如何,同样的标志.
即使您将符号保存到数据库,由于发布的timestamp参数,您仍然无法避免动态计算.
我会看到它有什么区别,它会产生什么不同,并且每隔x个时间用CLI脚本来计算热度,这对于那些至关重要的脚本来说,每隔一段时间它就会减少差异.
采用这种方法,您将只在必要时重新计算热度.这将使您的应用程序更加高效.