colonna di aggiornamento mysql con valore da un'altra tabella


221

Ho due tavoli, entrambi simili

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

Devo copiare il valore di value da tableAa in tableBbase al nome in ciascuna tabella.

Qualche consiglio per questa UPDATEaffermazione?

Risposte:


413

Oltre a questa risposta, se è necessario modificare dinamicamente tableB.value in base a tableA.value, è possibile fare ad esempio:

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'

sì, INNER JOINè perfetto in questa situazione. Ho anche usato CONCAT_WSper unire nome di prudenza e SKU da un'altra tabella
Vladkras il

2
C'è un modo per farlo usando gli alias?
Gellie Ann,

Ho provato questo, ma senza successo, perché il conteggio delle "righe interessate" mi dà 5690, ma le righe totali sono 59643, perché? questa è la domanda: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
Grande Sfinge,

Questo non funziona tableB ha ancora i propri dati senza cambiare. wtools.io/paste-code/bzWA Un esempio basato su OP e questa risposta.
sniffingdoggo

157

devi unirti ai due tavoli:

ad esempio, si desidera copiare il valore di nameda tableA in tableBcui hanno lo stessoID

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

AGGIORNAMENTO 1

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

AGGIORNAMENTO 2

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

1
Vivo oltre 1k record con nomi e valori diversi, ecco il tuo detto solo per il 1 ° record
LeoSam

puoi semplicemente rimuovere la whereclausola o modificarla in wherebase alle tue esigenze ..
John Woo,

anche la tabella B ha ottenuto più record della tabella A, la mia idea è controllare dalla tabella B a a se il nome esiste, copiare il valore di "valore" nella tabella B,!
LeoSam,

non so se ho capito bene la tua domanda, puoi controllare la mia risposta aggiornata?
John Woo,

ho provato entrambi gli aggiornamenti, il secondo dice eseguito su 734 righe, ho controllato i valori ancora tutti 0 non modificati
LeoSam

91

La seconda possibilità è,

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

7
Sì, non sono necessari join complicati, quando tutto ciò che serve è aggiornare un campo con un valore da un'altra tabella.
davidkonrad,

8
Sì, funziona bene ma è molto, molto lento su set di dati di grandi dimensioni. Se stai lavorando con tabelle di piccole dimensioni questo metodo va bene ma ti consiglio di JOIN come mostrato sopra per qualsiasi altra cosa.
venerdì

Inoltre, in questo scenario, le tabelle A e B non possono essere la stessa tabella a causa di vincoli SQL.
Muhwu,

@ frijj2k sarebbe ancora lento se .nameindicizzato su entrambe le tabelle?
Steverino,

3

La seconda opzione è fattibile anche se stai utilizzando la modalità di aggiornamento sicuro (e ricevi un errore che indica che hai provato ad aggiornare una tabella senza un WHERE che utilizza una colonna KEY), aggiungendo:

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

2
    UPDATE    cities c,
          city_langs cl
    SET       c.fakename = cl.name
   WHERE     c.id = cl.city_id

1

Archivia i tuoi dati nella tabella temporanea

Select * into tempTable from table1

Ora aggiorna la colonna

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

0

Nel mio caso, la soluzione accettata era troppo lenta. Per una tabella con 180.000 righe, la frequenza degli aggiornamenti era di circa 10 righe al secondo. Questo è con gli indici sugli elementi di join.

Alla fine ho risolto il mio problema usando una procedura:

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

Spero che possa aiutare qualcuno in futuro come mi ha aiutato


-4

Se hai un campo comune in entrambe le tabelle, è così facile! ....

Tabella-1 = tabella in cui si desidera aggiornare. Tabella-2 = tabella da cui si prendono i dati.

  1. esegui una query nella Tabella 1 e trova un valore di campo comune.
  2. crea un ciclo e trova tutti i dati dalla tabella 2 in base al valore della tabella 1.
  3. eseguire nuovamente la query di aggiornamento nella tabella 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();
    }


}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.