【问题标题】:MySQL/PHP updating a value in a variable number of rowsMySQL/PHP 更新可变行数中的值
【发布时间】:2012-10-31 04:47:02
【问题描述】:

我有一个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

【问题讨论】:

  • 我会用您当前的数据创建临时表。然后进行内部连接以立即更新记录。然后,您又面临如何定义声誉的“更新因素”的问题,例如-2、-10、+5... 等等。更新 tblUsers u JOIN temp_tblUsers t ON (u.ID=T.ID) SET p.REPUTATION = t.REPUTATION -2;

标签: php mysql sql arrays sql-update


【解决方案1】:

您可以将第二个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_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;

Documentation on MySQL transaction handling...

【讨论】:

  • -@Michael 谢谢,是的,使用 PHP 我可以 implode() user_id 数组为 IN 子句创建字符串。现在检查您的查询在我的应用程序中是否有意义...
  • -@Michael,我不确定交易是什么。您介意在回答中包含您建议的两个查询解决方案吗?
  • @timpeterson 添加。你的方法很好,逻辑只是乍一看令人困惑。
  • 在这种方法中,如果要订阅完全不同的信誉因素,如何调整它?
猜你喜欢
  • 2012-02-15
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 2014-09-23
  • 2014-12-17
  • 2012-05-03
  • 1970-01-01
相关资源
最近更新 更多