Mysql - 根据重复的 Table_1 值更新某些 Table_2 值

Posted

技术标签:

【中文标题】Mysql - 根据重复的 Table_1 值更新某些 Table_2 值【英文标题】:Mysql - Update certain Table_2 values depending on duplicate Table_1 values 【发布时间】:2013-12-18 01:48:44 【问题描述】:

我有两张桌子 - Table_1 和 Table_2。

它们具有相同的列 - Col1、Col2、Col3、Col4(整数)。

表 2 有一行包含以下值:

   Col1,Col2,Col3,Col4
1) a   ,b   ,0   ,0      (From Table_1)

Table_1 具有与 Col1 和 Col2 对应的重复值。

例如:

   Col1,Col2,Col3,Col4
1) a   ,b   ,0   ,1      (From Table_1) 
2) a   ,b   ,1   ,0      (From Table_1)
3) a   ,b   ,0   ,0      (From Table_1)

Col4(第 1 行)有一个“1”,Col3(第 2 行)有一个“1”。

当 Table_1 中的 Table_2 行的重复项的任何一列有 1 时,将 1 应用于相应列。

所以 Table_2 的最终值将是:

   Col1,Col2,Col3,Col4
1) a   ,b   ,1   ,1      (From Table_1)

我试过了

UPDATE Table_2 JOIN
       Table_1 ur
       ON Table_1.Col1 = Table_2.Col1 and Table_1.Col2 = Table_2.Col2
    SET Table_2.Col3 = if(Table_1.Col3 = 1,1,Col3), Table_2.Col4 = if(Table_1.Col4 = 1,1,Col4)

但它给了我以下结果:

   Col1,Col2,Col3,Col4
1) a   ,b   ,0   ,1      (From Table_1)

这意味着它只考虑第一个匹配项。如何考虑 Table_1 中的所有匹配项?

【问题讨论】:

我删除了 SQL Server 标签,因为您使用的是 mysql 语法。 【参考方案1】:

我很惊讶你的update 工作,考虑到列名的歧义。尝试使用显式表别名:

UPDATE Table_2 JOIN
       Table_1 ur
       ON ur.Col1 = Table_2.Col1 and ur.Col2 = Table_2.Col2
    SET Col3 = if(ur.Col3 = 1, 1, Table_2.Col3),
        Col4 = if(ur.Col4 = 1, 1, Table_2.Col4);

或者,一个更简单的公式(假设值始终为 0 和 1):

UPDATE Table_2 JOIN
       Table_1 ur
       ON ur.Col1 = Table_2.Col1 and ur.Col2 = Table_2.Col2
    SET Col3 = greatest(ur.Col3, Table_2.Col3),
        Col4 = greatest(ur.Col4, Table_2.Col4);

编辑:

哦,我明白了,Table_1 中有多行可用于更新。只会(任意)选择其中一行进行更新。在这种情况下,您需要预先聚合表。

UPDATE Table_2 JOIN
       (select col1, col2, max(col3) as col3, max(col4) as col4
        from Table_1
        group by col1, col2
       ) ur
       ON ur.Col1 = Table_2.Col1 and ur.Col2 = Table_2.Col2
    SET Col3 = greatest(ur.Col3, Table_2.Col3),
        Col4 = greatest(ur.Col4, Table_2.Col4);

【讨论】:

戈登,我试过上面的说法,但它给我的结果和以前一样。 @zenCoder 。 . .请参阅修改后的答案。我错过了问题的关键点。 两个表都有大约 150 万行。有没有办法可以优化您更新的查询?我开始查询已经过去了大约 7 个小时。 @zenCoder 。 . . Table_2(col1, col2) 上的索引可能会有所帮助。您也可以尝试在Table_1(col1, col2) 上建立索引,但我认为 MySQL 不会将其用于聚合。

以上是关于Mysql - 根据重复的 Table_1 值更新某些 Table_2 值的主要内容,如果未能解决你的问题,请参考以下文章

如何根据一行中的数字序列获取mysql-table列的最小值

根据外键更新表的值

从 MySQL 中的“重复键更新”获取动态值

加入 mysql 以更新表

mysql 根据两个字段值查询时如何去除重复数据

MYSQL 根据表 2 的列值更新表 1 列