我有一个有趣的计算情况需要在项目中进行,我正在寻找一种有效的方法来处理它。这是场景。
我们正在建立一个“民意调查”网站,用户可以回答民意调查问题。他们可以回答一次问题。
我们根据他们的答案为每个用户生成“分数”。对于回答相同的用户,他们会收到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
答案 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