2012-04-29 4 views
4

「トレンド」と見なされる特定のレコードを表示するフィルタを作成しようとしています。だから、投票が多いレコードを選択し、最も投票されているものから最も投票されていないものに降順に並べることは考えないでください。これは、ユーザが閲覧し、上にあるものだけでなく、すべてのリンクを見る機会を持つことができるようにするためです。これを行う最善の方法は何をお勧めしますか?どのようにランダムリンクを作成するのかは分かりませんが、ユーザーがページ間を移動するときにそれらを繰り返す必要はありません。助言がありますか?このうちのいずれかが不明な場合は、私に教えてください、ありがとう!MysqlとPHPで 'rising'または 'What's hot'クエリを作成するには?

+2

最初に、良いソート順と思われるものを定義します。これはあなたのアプリケーションの本当の肉です - あなたはいくつかのSQLのヘルプを得ることができます。 – Randy

+0

ソート順はどういう意味ですか? –

答えて

0

多分、それが持つビューの数を記録する新しい列を作成しますか?誰かがそれを見て、ビュー数が最も多いスレッドによって注文するたびに、それを更新します。

+0

ええ、アイデアは上から下へと順番に並べて表示するのではなく、無作為に並べ替えるのですが、高いものから低いものまで、意味がありますか?だから、最初のページショーでは800-900のどこか、700-800の次のどこかを見ることができます。 –

+1

はarray_rand()を使用します。 800-900の行をPHP配列に入れ、array_rand()をランダムにソートします。これらの行は、array_rand()の順序を使用して一番上に表示されます。各範囲でこれを繰り返します。 –

+0

確かに、1ページに25件の結果しか表示したくない場合は、結果を繰り返すことはしませんが、私は何をしたらいいのですか? –

2

この応答は、特定のアイテムのカウンタを単に+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 
+0

私はこのクエリーを完全に理解していないことを認めますが、私が探しているものは、よりランダムなものであるため、投票されたトピックを表示しますが、正確な順序ではリストしません。したがって、基本的に投票率が10%高いことがわかり、一般投票率が高い投票から無作為投票に5ページ以上ランダムに表示されます。しかし、結果を繰り返すことなく。 –

1

あなたは、あなたが要求ごとにランダムな順序を得ることができないことを意味し、いくつかのページを超えるアイテムを繰り返したくないことを言及しています。その代わりにアイテムを取得し、順序付けし、サーバー全体またはセッション固有のキャッシュに永続化する必要があります。

サーバー全体のキャッシュは、定義する必要がある時間間隔で1回ずつ更新する必要があります。この更新が行われたときにユーザーがページを切り替えると、アイテムがスクランブルされて表示されます。

セッション固有のキャッシュは、ユーザーがWebサイトを参照する限りアイテムを維持します。つまり、ユーザーが決して離れることができないアイテムは古くなります。もう一度、更新を実施するための時間間隔を決定する必要があります。

私はバージョン管理リストが必要だと思っています。サーバー全体のキャッシュソリューションを実行し、バージョン(日付、整数、何か)を与えることができます。あなたは最新のトレンドをブラウズするときにこのバージョンを渡す必要があり、ユーザーは同じリストを見続けるでしょう。 Trendsメニューのリンクをクリックするとバージョン情報なしで閲覧ページに送られ、最新の情報をキャッシュから取得する必要があります。ユーザーがこれらのページをブラウズしている間は、このままにしておきます。

私はSQLステートメントに入ることはできません。ハードではなく、データベース構造がわかりません。個別の票を別の表に記録していますか?それらは単なる列に集約されていますか?

+0

私は、ユーザーが投票したすべての投稿を追跡するためのテーブルを持っています。何千もの投稿があるとどうなるでしょうか?並べ替える必要のあるアイテムの数に関係なく、仕事を実行するだけですか?どのように組織をテーブルに保存できますか? (申し訳ありませんが、これは多くの質問に、単に学習しようとしています:) –

+0

データベースを検索するのは一致したものだから、適切なインデックスを設定する必要があります。あなたのコードで行われた注文は、あなたのデータベースから返された投稿の小さなサブセットにのみ適用されます。データベースから返された1000件のポストは、スピードを気にせずに注文することができるような少量です。その結果を、ポスト識別子のリストとして、またはレンダリングされたhtml、メモリ内にキャッシュして、要求時にユーザーを表示することができます。どんなタイプの組織について話していますか? – sisve

関連する問題