根据 MySQL 中的连接结果更新表

Posted

技术标签:

【中文标题】根据 MySQL 中的连接结果更新表【英文标题】:update a table based on the outcome of a join in MySQL 【发布时间】:2016-01-30 09:06:15 【问题描述】:

我理解这里的语法:

UPDATE table
SET column1 = expression1,
    column2 = expression2,
    ...
WHERE conditions;

这里:

UPDATE table1
SET column1 = (SELECT expression1
               FROM table2
               WHERE conditions)
WHERE conditions;

...但是如果我想更新怎么办

UPDATE table1
SET column1 = expression
if we get a particular result on a join between table1 and table2
which has WHERE conditions?

我似乎无法弄清楚,而且我在所有尝试中都遇到了语法错误。非常感谢任何建议。

【问题讨论】:

【参考方案1】:

mysql 中的语法是:

UPDATE table1 JOIN
       table2
       ON conditions
    SET table1.column1 = table2.expression1
    WHERE conditions;

【讨论】:

回过头来看看它,它的语法令人困惑,因为它以UPDATE 开头,但真正的更新在SET 语句中进行得更远。好像关键字UPDATE 真的不需要在那里。我觉得你可以将关键字UPDATE 更改为FOO 并且不会丢失信息。 @MonicaHeddneck 。 . . update 指定正在操作的表。 set 指定列。这实际上与selectfrom 的区别相同。 Update 更合理(在我看来),因为它首先定义了数据源。 所以基本上你说UPDATEUPDATE TABLE的缩写。【参考方案2】:

我要做的是先把它写成一个 SELECT 语句。

SELECT t.id
     , t.col   AS old_val
     , s.expr  AS new_val
  FROM target_table t
  JOIN source_table s
    ON s.somecol = t.somecol
   AND s.othercol < 1
 WHERE s.something_else = 'abc'

在此示例中,t.col 是我(最终)要为其分配新值的列。 (这里的SELECT语句中使用,这里只显示当前存储在列中的值。)

表达式s.expr 表示返回我要分配给col 的值的表达式。这可以像列引用一样简单,也可以是更复杂的表达式。

语句的其余部分是我们熟悉的普通FROMJOINONWHERE 子句。

一旦我有一个正在工作的SELECT 语句,我就可以通过

将它转换为一个UPDATE 语句 用关键字UPDATE替换SELECT ... FROM(在语句的开头) 在 WHERE 子句之前添加 SET 子句。

例如,我会将上面的 SELECT 语句转换为类似的内容,以将 s.expr 的值分配给 t.col

UPDATE target_table t
  JOIN source_table s
    ON s.somecol = t.somecol
   AND s.othercol < 1
   SET t.col = s.expr
 WHERE s.something_else = 'abc'

这是适合我的方法。首先将其编写为 SELECT 允许我进行测试、处理条件和表达式,并查看以验证将更新哪些行、替换哪些值以及将为每一行分配哪些值。

【讨论】:

以上是关于根据 MySQL 中的连接结果更新表的主要内容,如果未能解决你的问题,请参考以下文章

sql根据一个字段更新另一字段

mysql 子查询 根据查询结果更新表

来自连接表的 MySQL 更新语句(受该表的最新值限制)

使用 LEFT JOIN 更新 MySQL 中的多个表

如何更新mysql数据库表中的单条数据?

mysql更新列内部连接另一个表