使用日/周/月过滤热门项目

时间:2010-12-13 14:53:00

标签: php mysql filtering

我正在开发一个有200.000页的网站。还有一个浏览部分,显示最受欢迎,评价最高等文件。然而,在发布之后,这一部分将在几周后变得几乎静止。所以我也希望实现一个过滤系统,它将显示今天本周最受欢迎的产品,就像youtube一样。

就像这样:

http://www.youtube.com/videos?c=2

我该如何实现这个功能?我是否需要另一张桌子,每天都会为每个文件添加一个新条目?

docid,date,view_count,rating

因此,我将通过使用一天来获取今天的过滤行,或者使用周计算一周(7行)进行过滤?看起来效率不高。你有什么建议吗?

我顺便使用LAMP堆栈。

谢谢,

4 个答案:

答案 0 :(得分:1)

假设您为表中的记录加时间戳,您应该能够将where子句限制为将时间戳限制为您想要的任何时间范围。

您可以将结果缓存,特别是较长的结果,以便使请求无关紧要。

修改

但也许你的意思是今天最流行,而不是今天最流行的?

在这种情况下,我没有答案。

答案 1 :(得分:1)

最直接的方法是每次在recent_views(what, when)中显示资源时保存时间戳和资源ID。可以使用WHERE when > $beginOfPeriod AND when < $endOfPeriod等适当的WHERE子句创建每日/每周/每月图表。

出于性能原因,您可以每晚汇总值,将总和保存在单独的表中,如daily_views(what, sum)并截断源表。

答案 2 :(得分:0)

我想我会在代码中计算日期,然后将它们作为参数传递给您正在使用的SQL。

答案 3 :(得分:0)

我会用编译器来做。考虑到流量和响应时间,Youtube也可能也这样做。

原则很容易理解。您可以在page_view表中记录每个视图或评级。您可以定义编译发生的时间段(每小时,每天,每周,每月)。每当你遇到好时光时(例如:当天结束),你执行编译器,它基本上执行查询à-la ...

SELECT * FROM page_view WHERE date > $from_date AND date < $to_date

...并存储结果。这可能在cron工作中效果更好。

下次需要显示信息时,您只需获取存储的结果并显示即可,无需重新计算。您可以使用多种存储方法:MySQL表(例如:page_view_compiled),memcached等。