3

我有一张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
4

1 回答 1

3

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

我承认我觉得将所有这些都强制到一个查询中有点尴尬。除非性能是一个真正的问题,否则我宁愿将其视为包含在事务中的两个查询 - 一个用于减去用户-2user_id=1一个用于减去-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;

关于 MySQL 事务处理的文档...

于 2012-11-11T14:55:03.907 回答