0

私は現在、サイトの単純なランダム化投票システムを構築しようとしていますが、間違っていると思いますが、次の設定があります

ユーザーがサイトのランダム投票セクションに移動すると、最初にagpで最後に投票されたアイテムである投票可能なアイテムが表示されます。次に、ユーザーが以前に投票したものではなく、3番目に必要なアイテムです。関連する主題のリストに基づいて、それらに関連している。ちなみに、ユーザーが投票をスキップした場合、リストの後半で同じものを再度表示することはできず、統計を生成するためにすべての単一投票を記録する必要があります。

現在、私がこれを行っている方法は、以前に投票した投票項目ID番号のリストを含むデータベース内のアカウントに対してシリアル化された配列を保持することです。この時点で私はこれを容認せず、シリアル化された配列をデータベースに挿入するのはばかげたことであり、私の行動を後悔していると言いたいです;)。

それにもかかわらず、私はこれを行う別の方法を見つけることができませんでした。この時点で、配列はリストに追加される投票によって構築されます。しかし、私が続行すると、誰かが投票できるものが最大100個あるとすると、クエリは膨大になります。この時点で、このクエリを使用してリスト内の次のアイテムを取得しています。

//$finarr is the received unserialized list of values from the database

$sql = "SELECT * FROM vote_item_headers WHERE Id NOT IN (".$finarr.") ORDER BY LastVoted DESC LIMIT 1"

//execute query and display results

また、この時点では、上記の3番目の要件を追加することすらしていません。率直に言って、すべての要件を網羅する必要のあるクエリを実行する必要があるときに、どこから始めればよいのかさえわからなかったためです。その上。

関連性があると思われるもう少しの情報:以下で説明する他の表がいくつかあります。

core_users=ユーザーとその関心のリストcore_interests=すべての関心のリストcore_language=アイテムがvote_item_headersに分類される可能性のあるさまざまな言語のリスト=定義する関心とlangテーブルに参照があるすべての投票可能なアイテムのリスト投票可能なアイテムの追加のプロパティ。core_votes=人々の投票のマスターリスト

これがあなたたちにとってあまりにも曖昧であるならば、本当に申し訳ありません、私が本当に欲しいのは、結果を得るために組み合わせる必要がある大量の情報を扱うときのこの場合のガイダンスです。

どんな提案も歓迎します。私はそれを正しくするために全体を再構築することを嬉しく思います。

4

1 に答える 1

0

voted

user_id   | Id
----------+------
    1     | 12
    1     | 14
    1     | 187
    2     | 23

SELECT * FROM vote_item_headers 
    WHERE Id NOT IN (
        SELECT Id FROM voted WHERE user_id=1234
    ) 
    ORDER BY LastVoted DESC LIMIT 1

しかし、関連する投稿も必要です

relevant_posts

user_id   | Id
----------+------
    1     | 342
    1     | 253
    1     | 32
    2     | 53

SELECT vote_item_headers.* FROM vote_item_headers 
    # cut down the amount returned with relevant_posts table
    INNER JOIN relevant_posts ON (
        vote_item_headers.Id=relevant_posts.Id
        AND user_id=1234
    ) 
    WHERE vote_item_headers.Id NOT IN (
        SELECT Id FROM voted WHERE user_id=1234
    ) 
    ORDER BY LastVoted DESC LIMIT 1
于 2012-12-10T18:05:36.037 に答える