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;