【问题标题】:What is the best way to calculate page hits per day in MySQL在 MySQL 中计算每天页面点击量的最佳方法是什么
【发布时间】:2010-09-20 08:30:46
【问题描述】:

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

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

【问题讨论】:

    标签: sql mysql datetime


    【解决方案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 小时总计.. 不太清楚如何巧妙地做到这一点。最简单(虽然不是那么优雅)的方法是定期解析您的网络服务器日志。获取最近 24 小时的日志,统计每篇文章的请求数,并将这些数字存入数据库。

    【讨论】:

    • 要按照您的建议最好由另一种与 MySQL 配合使用的语言来完成。有一个额外的字段 (hits_day) 表示点击日期。添加到数据库时,首先检查那一天是否是今天。如果是这样,+1。如果不是,则重置回 1 并使 hits_day 等于今天。
    • 我采用这种方法的唯一原因是性能。我可以运行一个 cron 作业来计算每晚的受欢迎程度,然后我回到一个简单的 SELECT。不过,就我的目的而言,动态计算就可以了。
    【解决方案2】:

    我不完全确定您可以使用您在查询中建议的表结构。我能想到的唯一方法是通过每天最高的平均点击来获得前 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(或类似)数据类型。

    【讨论】:

    • 这是正确的想法,但我不想按 avg_hits 排序吗?
    • 是的,我在过去 5 分钟内得到了大约 5 个答案,而且我似乎一直在忘记一些事情......
    • 您的查询中有错字,顺便说一句。您需要在选择中使用另一个结束括号。
    • 实际上,我认为您甚至根本不需要 ORDER BY created 部分,因为您正在寻找热门文章而没有真正考虑时间。也许按标题排序以保持干净?
    • 啊,我添加了 GROUP BY 子句,一切都很好。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 2021-09-04
    相关资源
    最近更新 更多