Risposte:
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'
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
devi unirti ai due tavoli:
ad esempio, si desidera copiare il valore di name
da tableA in tableB
cui 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
where
clausola o modificarla in where
base alle tue esigenze ..
La seconda possibilità è,
UPDATE TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
);
.name
indicizzato su entrambe le tabelle?
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**
;
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);
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
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.
$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();
}
}
INNER JOIN
è perfetto in questa situazione. Ho anche usatoCONCAT_WS
per unire nome di prudenza e SKU da un'altra tabella