【问题标题】:mysql update column with value from another tablemysql用另一个表中的值更新列
【发布时间】:2012-07-29 11:54:04
【问题描述】:

我有两张桌子,看起来都像

id  name  value
===================
1   Joe     22
2   Derk    30

我需要根据每个表中的检查名称将value 的值从tableA 复制到tableB

关于UPDATE 声明的任何提示?

【问题讨论】:

    标签: mysql sql sql-update


    【解决方案1】:

    如果您需要根据 tableA.value 动态更改 tableB.value,除了这个答案之外,您还可以这样做:

    UPDATE tableB
    INNER JOIN tableA ON tableB.name = tableA.name
    SET tableB.value = IF(tableA.value > 0, tableA.value, tableB.value)
    WHERE tableA.name = 'Joe'
    

    【讨论】:

    • 是的,INNER JOIN 在这种情况下是完美的。我还使用CONCAT_WS 合并另一个表中的商品名称和 SKU
    • 有没有办法使用别名来做到这一点?
    • 我试过这个但没有成功,因为“受影响的行”计数给了我 5690,但总行数是 59643,为什么?这是查询:UPDATE participants_registrations INNER JOIN participants ON participants.id = participants_registrations.participantId INNER JOIN registrations ON registrations.id = participants_registrations.registrationId LEFT JOIN groups ON (groups.id = registrations.groupId) SET registrations.groupId = groups.id, registrations.groupName = groups.name, participants.memberOfGroupName = groups.name
    • 这不起作用。 tableB 仍然有自己的数据,没有变化。 wtools.io/paste-code/bzWA 基于 OP 和这个答案的示例。
    【解决方案2】:

    你需要加入两个表:

    例如,您想将 name 的值从 tableA 复制到 tableB 中,它们具有相同的 ID

    UPDATE tableB t1 
            INNER JOIN tableA t2 
                 ON t1.id = t2.id
    SET t1.name = t2.name 
    WHERE t2.name = 'Joe'
    

    更新 1

    UPDATE tableB t1 
            INNER JOIN tableA t2 
                 ON t1.id = t2.id
    SET t1.name = t2.name 
    

    更新 2

    UPDATE tableB t1 
            INNER JOIN tableA t2 
                 ON t1.name = t2.name
    SET t1.value = t2.value
    

    【讨论】:

    • 超过 1k 条记录不同的名称和值,这里你说的只是第一条记录
    • 您可以根据需要删除where 子句或修改where 子句..
    • 表 B 的记录也比表 A 多,我的想法是检查表 B 到 a 如果名称存在,将“值”的值复制到表 B,!
    • 我不知道我是否清楚地理解了您的问题,您可以查看我的更新答案吗?
    • 我确实尝试了两个更新,第二个说影响了 734 行,我检查了值仍然都是 0 没有改变
    【解决方案3】:

    第二种可能性是,

    UPDATE TableB 
    SET TableB.value = (
        SELECT TableA.value 
        FROM TableA
        WHERE TableA.name = TableB.name
    );
    

    【讨论】:

    • 是的,不需要复杂的连接,我们只需要使用另一个表中的值更新字段。
    • 是的,这工作正常,但在大型数据集上非常非常慢。如果您使用的是小表,则此方法很好,但我建议使用如上所示的 JOIN 用于其他任何操作。
    • 另外,在这种情况下,由于SQL约束,表A和B不能是同一张表。
    • @frijj2k 如果.name 在两个表上都被索引,这仍然会很慢吗?
    • @frijj2k - 当我使用 JOIN 方法执行此操作,然后重置表并使用上述方法重复时,JOIN 方法较慢。
    【解决方案4】:
        UPDATE    cities c,
              city_langs cl
        SET       c.fakename = cl.name
       WHERE     c.id = cl.city_id
    

    【讨论】:

    • 这个最简单。
    【解决方案5】:

    将数据存储在临时表中

    Select * into tempTable from table1
    

    现在更新列

     UPDATE table1
        SET table1.FileName = (select FileName from tempTable where tempTable.id = table1.ID);
    

    【讨论】:

      【解决方案6】:

      如果您使用的是安全更新模式,第二个选项也是可行的(并且您收到一个错误,表明您尝试更新没有使用 KEY 列的 WHERE 的表),方法是添加:

      UPDATE TableB  
      SET TableB.value = (  
      SELECT TableA.value  
          FROM TableA  
          WHERE TableA.name = TableB.name  
      )  
      **where TableB.id < X**  
      ;
      

      【讨论】:

        【解决方案7】:

        如果您在两个表中都有共同的字段,那么这很容易!....

        Table-1 = 要更新的表。 表 2 = 您从中获取数据的表。

        1. 在Table-1中进行查询,找到共同的字段值。
        2. 循环,根据表1的值查找表2中的所有数据。
        3. 再次在表 1 中进行更新查询。

        $qry_asseet_list = mysql_query("SELECT 'primary key field' FROM `table-1`");
        
        $resultArray = array();
        while ($row = mysql_fetch_array($qry_asseet_list)) {
        $resultArray[] = $row;
        }
        
        
        
        foreach($resultArray as $rec) {
        
            $a = $rec['primary key field'];
        
            $cuttable_qry = mysql_query("SELECT * FROM `Table-2` WHERE `key field name` = $a");
        
            $cuttable = mysql_fetch_assoc($cuttable_qry);
        
        
        
            echo $x= $cuttable['Table-2 field']; echo " ! ";
            echo $y= $cuttable['Table-2 field'];echo " ! ";
            echo $z= $cuttable['Table-2 field'];echo " ! ";
        
        
            $k = mysql_query("UPDATE `Table-1` SET `summary_style` = '$x', `summary_color` = '$y', `summary_customer` = '$z' WHERE `summary_laysheet_number` = $a;");
        
            if ($k) {
                echo "done";
            } else {
                echo mysql_error();
            }
        
        
        }
        

        【讨论】:

          【解决方案8】:

          就我而言,接受的解决方案太慢了。对于具有 180K 行的表,更新速率约为每秒 10 行。这与连接元素上的索引有关。

          我终于通过程序解决了我的问题:

          CREATE DEFINER=`my_procedure`@`%` PROCEDURE `rescue`()
          BEGIN
              declare str VARCHAR(255) default '';
              DECLARE n INT DEFAULT 0;
              DECLARE i INT DEFAULT 0;
              DECLARE cur_name VARCHAR(45) DEFAULT '';
              DECLARE cur_value VARCHAR(10000) DEFAULT '';
              SELECT COUNT(*) FROM tableA INTO n;
              SET i=0;
              WHILE i<n DO 
                SELECT namea,valuea FROM tableA limit i,1 INTO cur_name,cur_value;
                UPDATE tableB SET nameb=cur_name where valueb=cur_value;
                SET i = i + 1;
              END WHILE;
          
          END
          

          我希望它可以帮助将来像它帮助我一样的人

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-12-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-11
            • 1970-01-01
            • 2012-09-05
            相关资源
            最近更新 更多