在MySQL中计算每天页面点击次数的最佳方法是什么

时间:2008-11-01 23:54:37

标签: sql mysql datetime

my blog上,我在右侧导航中显示了10页最受欢迎的文章。这是我如何得到的:

SELECT *
FROM entries
WHERE is_published = 1
ORDER BY hits DESC, created DESC
LIMIT 10

我想要做的是每天点击页面点击显示前10名。我正在使用MySQL。有没有办法在数据库中做到这一点?

顺便说一句,created字段是日期时间。

更新:我想我没有说清楚。我想要的是1000天前发布的10,000次点击的博客文章,与1天前发布的10次点击的博客帖子具有相同的受欢迎程度。在伪代码中:

ORDER BY hits / days since posting

...其中hits只是一个在每次查看博客帖子时都会增加的int。

好的,这就是我将要使用的内容:

SELECT *, AVG(
    hits / DATEDIFF(NOW(), created)
) AS avg_hits
FROM entries
WHERE is_published = 1
GROUP BY id
ORDER BY avg_hits DESC, hits DESC, created DESC 
LIMIT 10
谢谢,斯蒂芬! (我喜欢这个网站......)

2 个答案:

答案 0 :(得分:6)

我不完全确定您可以使用您在查询中建议的表格结构。我能想到的唯一方法是通过每天最高的平均点击数来获得前10名。通过这样做,您的查询变为:

SELECT *, AVG(hits / DATEDIFF(NOW(), created)) as avg_hits
FROM entries
WHERE is_published = 1
GROUP BY id
ORDER BY avg_hits DESC
LIMIT 10

此查询假定您创建的字段属于DATETIME(或类似)数据类型。

答案 1 :(得分:1)

我猜你可以有一个hits_day_count列,它在每个视图上递增,还有一个hits_day_current。

在每个页面视图上,检查hits_day_current列是否为今天。如果没有,请重置命中计数。然后增加hits_day_count列,并将hits_day_current设置为当前日期时间。

的伪代码:

if article_data['hits_day_current'] == datetime.now():
    article_data['hits_day_count'] ++
else:
    article_data['hits_day'] = 0

article_data['hits_day_current'] = datetime.now()

这个问题很明显 - 时区。无论服务器位于何处,总计都会在00:00重置,这可能没用。

一个更好的解决方案是24小时滚动...不太确定如何做到这一点整齐。最简单(虽然不那么优雅)的方法是定期解析您的Web服务器日志。获取最近24小时的日志,计算每篇文章的请求数,并将这些数字放入数据库中。