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

在MySQL中,计算每天页面点击率的最佳方法是什么,sql,mysql,datetime,Sql,Mysql,Datetime,在上,我在右导航中显示了页面点击率方面最受欢迎的10篇文章。我是这样理解的: SELECT * FROM entries WHERE is_published = 1 ORDER BY hits DESC, created DESC LIMIT 10 我想做的是显示每天页面点击量排名前十的网站。我正在使用MySQL。有没有办法在数据库中执行此操作 顺便说一句,创建的字段是日期时间 更新:我想我还没有说清楚。我想要的是,1000天前发布的10000次点击的博客文章与1天前发布的10次点击的博客文

在上,我在右导航中显示了页面点击率方面最受欢迎的10篇文章。我是这样理解的:

SELECT *
FROM entries
WHERE is_published = 1
ORDER BY hits DESC, created DESC
LIMIT 10
我想做的是显示每天页面点击量排名前十的网站。我正在使用MySQL。有没有办法在数据库中执行此操作

顺便说一句,创建的
字段是日期时间

更新:我想我还没有说清楚。我想要的是,1000天前发布的10000次点击的博客文章与1天前发布的10次点击的博客文章一样受欢迎。在伪代码中:

ORDER BY hits / days since posting
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()
…其中,
hits
只是一个整数,每次查看博客文章时,该整数都会递增

好的,下面是我要使用的:

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

谢谢你,斯蒂芬!(我喜欢这个网站…

我不完全确定您是否可以使用您在查询中建议的表结构。我能想到的唯一办法就是以每天最高的平均点击率进入前十名。这样,您的查询将变成:

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

我想您可能会有一个hits\u day\u count列,在每个视图中递增,以及一个hits\u day\u current

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

伪代码:

ORDER BY hits / days since posting
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小时的日志,计算每篇文章的请求数,并将这些数字输入数据库。

这是个正确的想法,但我不想按平均点击次数排序吗?是的,我在过去5分钟内得到了大约5个答案,我似乎一直忘了一些事情……你的查询中有一个输入错误,顺便说一句,你需要另一个收尾部分。事实上,我认为你根本不需要“按创建顺序”部分,因为你在寻找顶级文章时没有真正考虑时间。也许是按标题排序以保持它看起来干净?啊,我添加了GROUPBY子句,它看起来很亮。谢谢要实现您的建议,最好使用另一种与MySQL配合使用的语言。有一个额外的字段(hits_day),表示点击的日期。添加到数据库时,首先检查当天是否为今天。如果是的话,+1。如果没有,请重置为1,并使hits_day等于今天。我采用这种方法的唯一原因是性能。我可以每晚运行一个cron作业来计算流行度,然后返回到一个简单的SELECT。不过,就我的目的而言,只需动态计算就可以了。