大数据集Cron工作建议

时间:2013-11-12 21:19:57

标签: php cron background-process

我有一个有趣的计算情况需要在项目中进行,我正在寻找一种有效的方法来处理它。这是场景。

我们正在建立一个“民意调查”网站,用户可以回答民意调查问题。他们可以回答一次问题。

我们根据他们的答案为每个用户生成“分数”。对于回答相同的用户,他们会收到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。

我的数据当前为单个用户回答的每个问题返回一行,以及每个答案的值数(逗号分隔:7,3)

我应该如何重建这些结果?我不想使用简单的“Foreach”来遍历每个用户,因为这似乎不会随着用户群的增长而扩展。有没有办法在后台或同时运行PHP脚本,以免导致循环挂起?

非常感谢任何帮助或建议!

编辑:

抱歉,我应该对数据库进行一些解释。

这是一个WordPress网站,因此部分数据位于默认的WordPress postmeta表中。计数器以逗号分隔的meta_key值存储为“Post”(轮询问题)

所有答案都存储在自己的答案表中。每个答案都是表格中的一行,它包括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

1 个答案:

答案 0 :(得分: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