0

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

我们正在制作一个“投票”网站,用户可以在其中回答投票问题。他们可以回答每个问题一次。

我们正在根据每个用户的回答为他们生成一个“分数”。他们每回答相同的其他用户获得 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 值

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