0

私はphpで書かれたウェブアプリケーションに取り組んでいます。mysqlテーブルにいくつかのオブジェクト(行として表される)があります。そして、私はそれらを1日のうちにランダムに表示する必要があります。

特定のオブジェクトの表示回数を制限するにはどうすればよいですか(たとえば、1時間に10回以下)。

ショーカウントとは、オブジェクトがレンダリングされた回数を意味します。

たとえば、100枚の画像があり、各ページビューでランダムに5枚が表示されます。1つの画像で1000回、別の画像で3回の表示を防ぐために、画像の表示回数を1時間に制限して、画像の表示分布を正規化する必要があります。

その有用な説明を願っています。

4

2 に答える 2

1

おそらく最も簡単な方法はlast_shown、テーブルに呼び出されたフィールドを追加し、1 時間以内に表示された場合は候補リストから除外することです。たとえば、これらの行に沿った何か:

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 分ごとに 1 回に減らすと、実質的に「1 時間に 10 回」と同様のロジックになり、まったく新しい参照テーブルは必要ありません。

于 2012-06-22T07:32:24.840 に答える
0

とでlogテーブルを作成できます。行をランダムに選択するたびに、過去 1 時間に 10 回以上表示されなかった行のみを選択するようにします。iddate_displayed

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()

また、1 時間後に古い挿入は不要になるため、DELETE クエリを実行して古いレコードを削除することもできます。

DELETE FROM log WHERE date_displayed < now() - interval 1 hour
于 2012-06-22T07:28:49.247 に答える