Antworten:
Zusätzlich zu dieser Antwort können Sie beispielsweise Folgendes tun, wenn Sie tableB.value entsprechend tableA.value dynamisch ändern müssen:
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
Sie müssen die beiden Tabellen verbinden:
Sie möchten beispielsweise den Wert von name
aus Tabelle A an die Stelle kopieren, an der tableB
sie denselben Wert habenID
UPDATE tableB t1
INNER JOIN tableA t2
ON t1.id = t2.id
SET t1.name = t2.name
WHERE t2.name = 'Joe'
UPDATE 1
UPDATE tableB t1
INNER JOIN tableA t2
ON t1.id = t2.id
SET t1.name = t2.name
UPDATE 2
UPDATE tableB t1
INNER JOIN tableA t2
ON t1.name = t2.name
SET t1.value = t2.value
where
Klausel einfach entfernen oder ändern where
, je nach Ihren Anforderungen.
Die zweite Möglichkeit ist:
UPDATE TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
);
.name
es auf beiden Tabellen indiziert ist?
Die zweite Option ist auch möglich, wenn Sie den sicheren Aktualisierungsmodus verwenden (und eine Fehlermeldung angezeigt wird, dass Sie versucht haben, eine Tabelle ohne ein WHERE zu aktualisieren, das eine KEY-Spalte verwendet), indem Sie Folgendes hinzufügen:
UPDATE TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
)
**where TableB.id < X**
;
Speichern Sie Ihre Daten in einer temporären Tabelle
Select * into tempTable from table1
Aktualisieren Sie nun die Spalte
UPDATE table1
SET table1.FileName = (select FileName from tempTable where tempTable.id = table1.ID);
In meinem Fall war die akzeptierte Lösung einfach zu langsam. Für eine Tabelle mit 180 KB Zeilen betrug die Aktualisierungsrate etwa 10 Zeilen pro Sekunde. Dies gilt für die Indizes der Join-Elemente.
Ich habe mein Problem schließlich mithilfe eines Verfahrens gelöst:
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
Ich hoffe, es wird in Zukunft jemandem helfen, so wie es mir geholfen hat
Wenn Sie in beiden Tabellen ein gemeinsames Feld haben, ist es so einfach! ....
Tabelle 1 = Tabelle, in der Sie aktualisieren möchten. Tabelle 2 = Tabelle, aus der Sie Daten entnehmen.
$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
ist perfekt in dieser Situation. Ich habe auchCONCAT_WS
den Produktnamen und die SKU aus einer anderen Tabelle zusammengeführt