0

プロジェクトで計算を行う必要がある興味深い状況があり、それを処理する効率的な方法を探しています。これがシナリオです。

ユーザーが投票の質問に答える「投票」ウェブサイトを作成しています。各質問に 1 回ずつ回答できます。

回答に基づいて、すべてのユーザーの「スコア」を生成しています。同じ回答をした他のユーザーごとに 1 ポイントを獲得します。

例えば:

Question 1 has 2 answers, "Yes" and "No"

 7 Users answered "Yes" and 3 answered "No"

  Each User that answered "Yes" adds 7 points to their score
  Each User that answered "No" adds 3 points to their score

   If a 4th User answers "No", 1 extra point is added to each User that answered "No"

ご想像のとおり、質問に回答するたびに多くのユーザー スコアを再生成する必要があるため、これをその場で行うには計算が多すぎます。だから私はX時間ごとにこれをCron Jobとしてやりたい。

My Data は現在、1 人のユーザーが回答した質問ごとに 1 つの行を返し、各回答のポイント数 (カンマ区切り: 7,3) を返します。

これらの結果を再生成するにはどうすればよいですか? 単純な「Foreach」を使用してすべてのユーザーをループしたくありません。これは、ユーザーベースが成長するにつれてスケーリングするようには見えないためです。ループがハングしないように、PHP スクリプトをバックグラウンドまたは同時に実行する方法はありますか?

どんな助けや提案も大歓迎です!

編集:

申し訳ありませんが、データベースについても少し説明する必要がありました。

これは WordPress Web サイトであるため、一部のデータはデフォルトの WordPress postmeta テーブルにあります。集計は、「投稿」(投票の質問) のカンマ区切りの meta_key 値として保存されます。

すべての回答は、独自の回答テーブルに保存されます。各回答はテーブル内の行であり、user_id、post_id (投票質問の)、選択された回答 (カンマ区切りの meta_key 値のインデックス) が含まれます。

これは、特定のユーザーのすべての回答を取得するために使用しているクエリです。

SELECT * FROM `wp_myo_ip` LEFT JOIN `wp_postmeta` ON `wp_myo_ip`.`myo_polling_id` = `wp_postmeta`.`post_id` AND `wp_postmeta`.`meta_key` = 'myo-votes'  WHERE `wp_myo_ip`.`myo_polling_ip` = 1

列は実際にはmyo_polling_ipユーザー ID です

4

1 に答える 1

0

絶対に与えられたデータベース情報に基づいていません...

UPDATE answer_tbl 
    LEFT JOIN (SELECT answer_tbl.id, IF(answer_tbl.answer = 'YES', COUNT(yes_tbl.id), COUNT(no_tbl.id)) AS score
                FROM answer_tbl
                    LEFT JOIN answer_tbl AS yes_tbl ON answer_tbl.question_id = yes_tbl.question_id AND yes_tbl.answer = 'YES'
                    LEFT JOIN answer_tbl AS no_tbl ON answer_tbl.question_id = no_tbl.question_id AND no_tbl.answer = 'NO'
                WHERE 1
                GROUP BY answer_tbl.id) AS score_tbl
    SET answer_tbl.score AS score_tbl.score
    WHERE answer_tbl.id = score_tbl.score
于 2013-11-12T21:37:14.010 に答える