Mysql 使用额外条件更新 2 个不同表中的 2 列

Mysql Update 2 columns from 2 different tables with extra condition

我想更新 mysql 中两个不同 table 的两个不同列。这是我想做的事情的简短版本。

更详细地说,我只想在条件为真时从 table 1 更新列。否则我想从 table 1.

更新另一列

我想为 table 2 做同样的事情,这应该在一个 UPDATE 语句中完成。

我试过这样的事情:

UPDATE `grouped_messages`
JOIN `messages` ON (`messages`.group_msg_id = 1) SET 
(CASE WHEN(`grouped_messages`.`conversation_partner1`=10) THEN `grouped_messages`.`deletion_status_partner1`=1
WHEN(`grouped_messages`.`conversation_partner2`=10) THEN `grouped_messages`.`deletion_status_partner2`=1 END),
(CASE WHEN(`messages`.`from`=10) THEN `messages`.`deletion_status_from`=1 
WHEN(`messages`.`to`=10) THEN `messages`.`deletion_status_to`=1 END);

但这不起作用。有人知道适合我的情况的解决方案吗?

您不能在 CASE 表达式中进行赋值。您的 SET 子句无效。必须是 SET column = expression.

有条件地更新列;也就是说,要更新列 not,请使用表达式 return 列的 当前值

让我们使用 g 作为 grouped_messages 的别名。

当您检查的条件为真时,您希望 SET 子句等效于:

SET g.deletion_status_partner1 = 1

当条件为真时,要将列的当前值赋给自己,所以SET子句等价于:

SET g.deletion_status_partner1 = g.deletion_status_partner1

要做到这一点,您可以这样做:

 SET g.deletion_status_partner1
     = CASE WHEN g.conversation_partner1 = 10
       THEN 1
       ELSE g.deletion_status_partner1 -- existing column value
       END

要修改其他列,您需要添加到 SET 子句

   , g.deletion_status_partner2
     = CASE WHEN some_other_condition
       THEN new_value
       ELSE g.deletion_status_partner2 -- existing column value
       END

(我没有检查您的陈述中的任何其他内容;我只强调了最明显的问题,以及如何获取更新语句来执行 "conditional" 赋值。)