columna de actualización de mysql con valor de otra tabla

221

Tengo dos mesas, ambas parecidas

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

Necesito copiar el valor de valuefrom tableAa en tableBfunción del nombre de verificación en cada tabla.

¿Algún consejo para esta UPDATEdeclaración?

LeoSam
fuente

Respuestas:

413

Además de esta respuesta, si necesita cambiar dinámicamente el valor tableB.según el valor tableA.valor, puede hacer, por ejemplo:

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'
RafaSashi
fuente
Sí, INNER JOINes perfecto en esta situación. También solía CONCAT_WSfusionar el nombre del producto y el SKU de otra tabla
vladkras el
2
¿Hay alguna manera de hacer esto usando alias?
Gellie Ann
Intenté esto pero no tuve éxito, porque el recuento de "filas afectadas" me da 5690, pero las filas totales son 59643, ¿por qué? esta es la consulta: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
Great Sphinx
Esto no funciona La tabla B todavía tiene sus propios datos sin cambiar. wtools.io/paste-code/bzWA Una muestra basada en OP y esta respuesta.
sniffingdoggo
157

necesitas unir las dos tablas:

por ejemplo, desea copiar el valor de nametableA en tableBdonde tienen el mismoID

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

ACTUALIZACIÓN 1

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

ACTUALIZACIÓN 2

UPDATE tableB t1 
        INNER JOIN tableA t2 
             ON t1.name = t2.name
SET t1.value = t2.value
John Woo
fuente
1
Ive más de 1k registro con diferentes nombres y valores, aquí su dicho solo para el 1er registro
LeoSam
simplemente puede eliminar la wherecláusula o modificarla wheresegún sus necesidades ..
John Woo
también la tabla B obtuvo más registros que la tabla A, mi idea es verificar de la tabla B a una si el nombre existe copiar el valor de "valor" en la tabla B,!
LeoSam
No sé si entendí tu pregunta claramente, ¿puedes verificar mi respuesta actualizada?
John Woo
probé ambas actualizaciones, la segunda dice que se realizó en 734 filas, verifiqué los valores todavía todos 0 no cambiaron
LeoSam
91

La segunda posibilidad es,

UPDATE TableB 
SET TableB.value = (
    SELECT TableA.value 
    FROM TableA
    WHERE TableA.name = TableB.name
);
Samir Alajmovic
fuente
77
Sí, no es necesario realizar combinaciones complicadas, cuando todo lo que necesitamos es actualizar un campo con un valor de otra tabla.
davidkonrad
8
Sí, esto funciona bien, pero es muy, muy lento en grandes conjuntos de datos. Si está trabajando con tablas pequeñas, este método está bien, pero recomiendo JOIN como se muestra arriba para cualquier otra cosa.
frijj2k
Además, en este escenario, las tablas A y B no pueden ser la misma tabla debido a restricciones de SQL.
Muhwu
@ frijj2k ¿seguiría siendo lento si .namese indexa en ambas tablas?
Steverino
3

La segunda opción también es factible si está utilizando el modo de actualizaciones seguras (y obtiene un error que indica que ha intentado actualizar una tabla sin un DÓNDE que usa una columna CLAVE), agregando:

UPDATE TableB  
SET TableB.value = (  
SELECT TableA.value  
    FROM TableA  
    WHERE TableA.name = TableB.name  
)  
**where TableB.id < X**  
;
raul7
fuente
2
    UPDATE    cities c,
          city_langs cl
    SET       c.fakename = cl.name
   WHERE     c.id = cl.city_id
aitbella
fuente
1

Almacene sus datos en la tabla temporal

Select * into tempTable from table1

Ahora actualice la columna

 UPDATE table1
    SET table1.FileName = (select FileName from tempTable where tempTable.id = table1.ID);
Abid Mahmood
fuente
0

En mi caso, la solución aceptada fue demasiado lenta. Para una tabla con 180K filas, la tasa de actualizaciones fue de aproximadamente 10 filas por segundo. Esto es con los índices en los elementos de unión.

Finalmente resolví mi problema usando un procedimiento:

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

Espero que ayude a alguien en el futuro como me ayudó

justadev
fuente
-4

Si tiene un campo común en ambas tablas, ¡entonces es tan fácil! ...

Tabla-1 = tabla donde desea actualizar. Tabla-2 = tabla de donde tomas los datos.

  1. haga una consulta en la Tabla-1 y encuentre el valor de campo común.
  2. haga un bucle y encuentre todos los datos de la Tabla 2 de acuerdo con el valor de la tabla 1.
  3. nuevamente haga una consulta de actualización en la tabla 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();
    }


}
Mahabubur Rahman Masum
fuente