我想要检索24小时内查看次数最多的页面,但我没有在页面(帖子)和视图计数之间建立1对1的关系。
articles table
id | title | content | created | view_count
-----+-----------+---------+------------+------------
1 | title-1 | info-1 | 1386478352 | 2
2 | title-2 | info-2 | 1386532855 | 90
3 | title-3 | info-3 | 1386637325 | 25
4 | title-4 | info-4 | 1386812249 | 5
5 | title-5 | info-5 | 1387094028 | 10
我正在使用以下内容来检索有史以来观看次数最多的内容,但我需要每24小时重置一次。
SELECT * FROM articles ORDER BY view_count DESC
有没有办法可以使用information_schema而不是在文章和视图计数之间创建1对1关系,并在每次查看文章时存储页面请求的时间?
答案 0 :(得分:2)
我建议不要使用底层DBS的任何实现细节。您将很难进行迁移/更新。
那说我建议一个简单的1:n关系Pageview(articleId,viewdate)。每个用户视图都会在页面视图中添加时间戳。然后,您可以轻松地加入,聚合并根据需要执行任何操作。
SELECT articles.*, COUNT(*) views24h
FROM articles
LEFT JOIN pageview ON pageview.articleId = articles.Id
AND pageview.viewdate > SUBDATE(NOW(),1)
GROUP BY article.id
ORDER BY views24h DESC
LIMIT 10;
答案 1 :(得分:1)
您应该更改数据库模型。
例如,创建一个以date
和article_id
列命名的表。
然后为每个视图插入一个新行。像:
INSERT INTO views (date, article_id) VALUES (UNIX_TIMESTAMP(),1)
现在您可以进行此类查询,以便在过去24小时内返回视图:
SELECT count(*) FROM views WHERE article_id = 1 AND date > UNIX_TIMESTAMP() - 86400
这将在过去的24小时内返回文章的所有访问次数为1。