2008-11-01 58 views
4

my blog上,我在右侧导航栏中显示了页面点击量方面的10个最热门文章。以下是我得到那个:在MySQL中每天计算页面点击次数的最佳方法是什么

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

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

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

更新:我想我还没有明确表态。我想要的是,在1,000天前发布的具有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 

谢谢,史蒂芬! (我喜欢这个网站...)

回答

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(或类似的)数据类型。

+0

这是正确的想法,但我不想要命令由avg_hits? – 2008-11-02 00:24:04

+0

是的,我在过去的5分钟里有5个答案,我似乎一直在忘记东西...... – 2008-11-02 00:25:40

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小时的日志,计算每篇文章的请求数量,并将这些数字放入数据库中。

相关问题