Yanıtlar:
Bu cevaba ek olarak tableB.value değerini tableA.valure'a göre dinamik olarak değiştirmeniz gerekirse, örneğin şunları yapabilirsiniz:
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
iki tabloya katılmanız gerekir:
örneğin name
, tableA öğesinin değerini tableB
aynı oldukları yere kopyalamak istiyorsunuzID
UPDATE tableB t1
INNER JOIN tableA t2
ON t1.id = t2.id
SET t1.name = t2.name
WHERE t2.name = 'Joe'
GÜNCELLEME 1
UPDATE tableB t1
INNER JOIN tableA t2
ON t1.id = t2.id
SET t1.name = t2.name
GÜNCELLEME 2
UPDATE tableB t1
INNER JOIN tableA t2
ON t1.name = t2.name
SET t1.value = t2.value
where
cümleyi kaldırabilir veya where
ihtiyaçlarınıza göre cümleyi değiştirebilirsiniz ..
İkinci olasılık,
UPDATE TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
);
.name
her iki tabloda da dizin oluşturulmuşsa bu hala yavaş olur mu?
İkinci seçenek, güvenli güncellemeler modunu kullanıyorsanız (ve KEY sütunu kullanan bir WHERE olmadan bir tabloyu güncellemeye çalıştığınızı belirten bir hata alıyorsanız) da mümkündür:
UPDATE TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
)
**where TableB.id < X**
;
Verilerinizi geçici tabloda depolayın
Select * into tempTable from table1
Şimdi sütunu güncelleyin
UPDATE table1
SET table1.FileName = (select FileName from tempTable where tempTable.id = table1.ID);
Benim durumumda, kabul edilen çözüm çok yavaştı. 180K sıralı bir tablo için güncelleme hızı saniyede yaklaşık 10 sıra idi. Bu, birleştirme öğelerindeki dizinlerle ilgilidir.
Sonunda sorunumu bir prosedür kullanarak çözdüm:
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
Umarım gelecekte bana yardım etmiş gibi yardımcı olur
Her iki tabloda ortak alanınız varsa o zaman çok kolay! ....
Tablo-1 = güncellemek istediğiniz tablo. Tablo-2 = veri alacağınız tablo.
$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
bu durumda mükemmel. Ben deCONCAT_WS
başka bir tablodan