我正在編寫一個用PHP編寫的web應用程序。我有一些對象(表示爲行)在MySQL表中。我需要在一天內隨機顯示它們。限制一小時特定對象顯示數量的最佳方法?
如何限制特定對象的顯示次數,例如一小時不超過10次?
顯示次數我的意思是對象被渲染的次數。
例如,有100個圖像,每個頁面瀏覽隨機顯示5個。我需要對圖像顯示分佈進行標準化,方法是將圖像的顯示計數限制爲一小時,以防止一個圖像顯示1000個節目,另一個圖像顯示3個。
希望其有用的解釋。
我正在編寫一個用PHP編寫的web應用程序。我有一些對象(表示爲行)在MySQL表中。我需要在一天內隨機顯示它們。限制一小時特定對象顯示數量的最佳方法?
如何限制特定對象的顯示次數,例如一小時不超過10次?
顯示次數我的意思是對象被渲染的次數。
例如,有100個圖像,每個頁面瀏覽隨機顯示5個。我需要對圖像顯示分佈進行標準化,方法是將圖像的顯示計數限制爲一小時,以防止一個圖像顯示1000個節目,另一個圖像顯示3個。
希望其有用的解釋。
也許這樣做會增加一個字段名爲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次」的邏輯類似,並且不需要整個新的參考表。
如果在一個小時內邏輯條件是10次,那麼它並不等同於每6分鐘一次 - 在上半個小時內可以顯示一個項目10次以上。無論如何,如果你使用這種方法,你應該在'last_shown'字段中添加一個索引,否則每次選擇這些項時它都會進行全表掃描。 –
您可以使用id
和date_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
謝謝!這種方法資源密集? – CodingHamster
如果刪除日誌中的較舊記錄,它將包含很少的記錄,所以我不相信這會有很大的影響。您還可以在'date_displayed'字段中添加一個索引以避免全表掃描。然後,由於您在主鍵上使用條件,因此從'table'中進行選擇會很快完成。 –
請給出一些樣本數據並解釋'show count'的含義。 –
[你有什麼試過?](http://whathaveyoutried.com) – Havelock