2012-06-22 19 views
0

我正在編寫一個用PHP編寫的web應用程序。我有一些對象(表示爲行)在MySQL表中。我需要在一天內隨機顯示它們。限制一小時特定對象顯示數量的最佳方法?

如何限制特定對象的顯示次數,例如一小時不超過10次?

顯示次數我的意思是對象被渲染的次數。

例如,有100個圖像,每個頁面瀏覽隨機顯示5個。我需要對圖像顯示分佈進行標準化,方法是將圖像的顯示計數限制爲一小時,以防止一個圖像顯示1000個節目,另一個圖像顯示3個。

希望其有用的解釋。

+0

請給出一些樣本數據並解釋'show count'的含義。 –

+0

[你有什麼試過?](http://whathaveyoutried.com) – Havelock

回答

1

也許這樣做會增加一個字段名爲last_shown你的表,然後,如果它已經在一小時內顯示從候選列表中排除它最簡單的方法。如東西沿着這些線路:

SELECT id FROM my_objects WHERE last_shown < DATE_SUB(NOW(), INTERVAL 1 HOUR) ORDER BY RAND() LIMIT 1

然後,當您顯示實際的對象,時間戳列,即:

UPDATE my_objects SET last_shown = NOW() WHERE id = <the_id_you_displayed>

這種方法比較簡單,但同樣有效。如果您將時間範圍縮短爲每6分鐘一次,那麼它實際上與「一小時內10次」的邏輯類似,並且不需要整個新的參考表。

+1

如果在一個小時內邏輯條件是10次,那麼它並不等同於每6分鐘一次 - 在上半個小時內可以顯示一個項目10次以上。無論如何,如果你使用這種方法,你應該在'last_shown'字段中添加一個索引,否則每次選擇這些項時它都會進行全表掃描。 –

0

您可以使用iddate_displayed創建log表。 每次隨機選擇行時,請確保只選擇在最近一小時內未顯示的次數超過10次的行。

SELECT * FROM table 
WHERE id NOT IN ( 
    SELECT id FROM log 
    WHERE date_displayed > now() - interval 1 hour 
    GROUP BY id HAVING COUNT(*) >= 10 
) 
ORDER BY rand() 

此外,一小時後不再需要更舊的插入,因此您可能想要執行DELETE查詢以刪除舊記錄。

DELETE FROM log WHERE date_displayed < now() - interval 1 hour 
+0

謝謝!這種方法資源密集? – CodingHamster

+0

如果刪除日誌中的較舊記錄,它將包含很少的記錄,所以我不相信這會有很大的影響。您還可以在'date_displayed'字段中添加一個索引以避免全表掃描。然後,由於您在主鍵上使用條件,因此從'table'中進行選擇會很快完成。 –

相關問題