2008-11-01 60 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小時的日誌,計算每篇文章的請求數量,並將這些數字放入數據庫中。

相關問題