php - 人气,如何让新点击率高于旧点击率?

标签 php mysql algorithm popularity

每个产品都有一个 product_date_added,它是一个包含添加日期的 Date 字段。 他们还有一个 product_views,这是一个 int 字段,其中包含查看产品的次数。

为了按受欢迎程度显示产品,我使用了一种算法来计算产品每天有多少次点击。

SELECT 
    AVG(product_views / DATEDIFF(NOW(), product_date_added)) as avg_hits
    , product_table.* 
FROM product_table
WHERE product_available = "yes" 
GROUP BY product_id
ORDER BY avg_hits DESC

这行得通,但老板注意到很多旧产品首先出现。所以他基本上希望新的观点比旧的观点有更多的权重。

他的建议是任何超过一岁的观看次数都不算数。我想我必须保留每个 View 的日期才能做到这一点,我认为这会降低性能。

创建像我老板所要求的受欢迎程度算法的最佳方法是什么?

理想情况下,我希望能够想出一些不会改变表结构的东西。如果那不可能,我至少想提出一个可以使用现有数据的解决方案,这样我们就不会从 0 开始。如果那也不可能,那么任何可行的方法都行不通。

最佳答案

您不必(因此)保留每个 View 的日期。您可以改为在包含以下列的表中为每个项目保留最多 366 行:product_id、day_of_year、count。每天运行一项任务,将一年前的所有计数归零。如果您不介意非规范化数据,该任务还可以更新项目本身的“计数”字段以进行快速检索,这样您的查询就不需要更改。 product_views 刚变成 product_views_in_the_last_year。 1 天的时间段是任意的——我怀疑你是否关心流行度是基于恰好 1 年的窗口,所以我希望它也可能是一个小时、一周或两周,具体取决于你有多少桶我们愿意处理。

另一种方案可能是使用指数衰减。把计数字段变成十进制类型。每天一次,将每个项目的计数减少一个固定的百分比(小于 1%,大于 0.1%),这样越近的命中,它的“权重”就越大。如此古老的流行永远不会完全消失,但一年前的热门歌曲不会有太大贡献。顺便说一句,与此方案等效的是保留代码原样,但确保您的网站作为一个整体随着时间的推移变得更受欢迎 ;-)

至于避免从零开始 - 可以一次性减少每件元素的数量,减少比例取决于元素的使用年限。总的来说,您会期望较旧的对象具有较旧的 View ,因此被当前方案高估了。这不是万无一失的,因为也许一些较旧的项目最近获得了很多点击。通过查看最近的 Web 服务器日志,或者在进行一次性减少之前花一周或一个月的时间计算点击率,您也许能够识别这些项目。即使不这样做,如果他们的受欢迎程度有一个根本原因(不仅仅是因为他们目前在您的排名中排名很高,因此从查看您的“最受欢迎”图表的人那里获得流量),那么希望他们会在一段时间内恢复.

关于php - 人气,如何让新点击率高于旧点击率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3753493/

相关文章:

Javascript 函数根据选择选项的值选中一个框

php - fetchAll() 函数中的 PDO::FETCH_OBJ 参数

PHP 读取realm.io 文件

php - 为什么我的 4 个 PHP 输入中只有 1 个正确写入数据库?

php - 创建 MySQL 临时表并在 PHP 中从中选择

c - 有什么方法可以改进这个函数,用 malloc 分配的字符串中的另一个字符串替换子字符串的出现?

php - 无法在 php 脚本中执行 sql INSERT 查询 (mysql_query)。 PHP/MySQL——时间敏感

mysql - MySQL 中何时使用单引号、双引号和反引号

c++ - 尝试在C++中实现运行长度平滑算法

algorithm - 一种膨胀/收缩(偏移、缓冲)多边形的算法