「トレンド」と見なされる特定のレコードを表示するフィルターを作成しようとしています。そのため、投票数の多いレコードを選択するが、投票数の多いものから少ないものへの降順でリストするのではありません。これは、ユーザーがトップにあるリンクだけでなく、すべてのリンクを参照して表示できるようにするためです。これを行うための最良の方法は何ですか?トレンド リンクのランダムな組み合わせを作成する方法についてはわかりませんが、ユーザーがページからページに移動するときにそれらを繰り返さないようにします。助言がありますか?不明な点があればお知らせください。ありがとうございます。
3 に答える
この応答は、特定のアイテムのカウンターを単に +1 するのではなく、各投票の行ごとに子テーブルで投票を追跡していることを前提としています。
トレンドのトピックに関心のある時間枠を決定します。1時間くらいがいいかな。
次に、クエリを実行して、過去 1 時間で投票数が最も多いアイテムを特定します。この数で注文すると、最も支持されたアイテムのリストが継続的に更新されます。
SELECT items.name, item_votes.item_count FROM items
INNER JOIN
(
SELECT item_id, COUNT(item_id) AS item_count
FROM item_votes
WHERE date >= dateAdd(hh, -1, getDate()) AND
## only count upvotes, not downvotes
item_vote > 0
group by item_id
) AS item_votes ON item_votes.item_id = items.item_id
ORDER BY item_votes.item_count DESC
複数のページにわたってアイテムを繰り返したくないということは、リクエストごとにランダムな順序を取得できないことを意味します。代わりに、アイテムを取得して並べ替え、サーバー全体またはセッション固有のキャッシュに保持する必要があります。
サーバー全体のキャッシュは、定義する必要がある時間間隔で、時々更新する必要があります。この更新が発生したときにユーザーがページを切り替えると、アイテムがスクランブルされて表示されます。
セッション固有のキャッシュは、ユーザーが Web サイトを閲覧している限りアイテムを維持します。つまり、ユーザーがサイトを離れなければ、アイテムは古くなります。繰り返しになりますが、更新を強制する時間間隔を決定する必要があります。
バージョン付きリストが必要だと思います。サーバー全体のキャッシュ ソリューションを実行して、バージョン (日付、整数など) を与えることができます。最新のトレンドを閲覧するときにこのバージョンを渡す必要があり、ユーザーは同じリストを表示し続けます。[トレンド] メニュー リンクをクリックすると、バージョン情報なしで閲覧ページに送信され、キャッシュから最新のものを取得する必要があります。ユーザーがこれらのページを閲覧している限り、これを保持します。
難しいからではなく、SQL ステートメントに入ることができませんが、データベース構造がわかりません。個々の投票を別のテーブルで追跡していますか? それらは単一の列に集約されているだけですか?
ビューの数を記録する新しい列を作成することはできますか? 次に、誰かが閲覧するたびに更新し、閲覧数が最も多いスレッドで並べ替えます。