MySQL/PHP更新可变行数的值

MySQL/PHP更新可变行数的值,php,mysql,sql,arrays,sql-update,Php,Mysql,Sql,Arrays,Sql Update,我有一个users表,其中存储了用户信息以及Stackoverflow所拥有的声誉分数 我的问题是如何用一个MySQL查询更新多个用户的声誉 这是我的users表 user_id reputation 1 11 2 202 3 3003 4 444 5 555 假设user_id=1否决user_id=4和user_id=5。在这种情况下,user_id=1的声誉损失2分,user_id=4,

我有一个
users
表,其中存储了用户信息以及Stackoverflow所拥有的声誉分数

我的问题是如何用一个MySQL查询更新多个用户的声誉

这是我的
users

user_id  reputation
  1          11
  2         202
  3        3003
  4         444
  5         555
假设user_id=1否决user_id=4和user_id=5。在这种情况下,user_id=1的声誉损失2分,user_id=4,5都损失10分

users
表将如下所示:

user_id  reputation
  1           9 //lost 2 points
  2         202
  3        3003
  4         434 //lost 10 points
  5         545 //lost 10 points
我知道下面显示的MySQL查询是有效的,但是我想知道一个通用的解决方案,在这种情况下,
UPDATE
的用户数量是可变的,并且取决于投票

UPDATE `users`
 SET `reputation` = CASE
 WHEN `user_id` = '1' THEN reputation - 2
 WHEN `user_id` = '4' THEN reputation - 10
 WHEN `user_id` = '5' THEN reputation - 10
 ELSE `reputation` END

您可以将第二个
WHEN
替换为
IN()
子句。它仍然需要在应用程序代码中构建一些动态查询,但是如果您的API允许将数组直接绑定到
in()
子句中,这就容易多了

UPDATE `users`
 SET `reputation` = CASE
 WHEN `user_id` = '1' THEN reputation - 2
 WHEN `user_id` IN ('2','3','4') THEN reputation - 10
 ELSE `reputation` END
不过,我承认,我觉得把所有这些都强加于一个问题有点尴尬。除非性能是一个真正的问题,否则我宁愿将其视为一个事务中包含的两个查询—一个从
user\u id=1
中减去
-2
,另一个减去
-10
用户

/* Only on InnoDB tables... */
START TRANSACTION;
Update `users` SET `reputation` = `reputation` - 2 WHERE `user_id` = 1;
Update `users` SET `reputation` = `reputation` - 10 WHERE `user_id` IN (2,3,4);
COMMIT;

-@Michael谢谢,是的,使用PHP我可以只
内爆()
用户id数组来生成
子句的字符串。正在检查您的查询在我的应用程序中是否有意义…@Michael,我不确定什么是事务。蒂姆彼得森补充道:“你介意在回答中包括你建议的两个问题和解决方案吗?”。你的方法很好,第一眼看到的逻辑很混乱。在这种方法中,如果你有完全不同的声誉因素要细分,你如何调整它?我会用你当前的数据创建临时表。然后执行内部联接以立即更新记录。然后,你再次面临如何定义声誉的“更新因素”的问题,例如-2、-10、+5。。。等等。更新t lusers u JOIN temp_tblUsers t ON(u.ID=t.ID)设置p.REPUTATION=t.REPUTATION-2;