Відповіді:
На додаток до цієї відповіді, якщо вам потрібно змінити значення tableB.value відповідно до tableA.value, ви можете зробити, наприклад:
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
вам потрібно з'єднати дві таблиці:
наприклад, ви хочете скопіювати значення name
з tableA у те місце, tableB
де вони однаковіID
UPDATE tableB t1
INNER JOIN tableA t2
ON t1.id = t2.id
SET t1.name = t2.name
WHERE t2.name = 'Joe'
ОНОВЛЕННЯ 1
UPDATE tableB t1
INNER JOIN tableA t2
ON t1.id = t2.id
SET t1.name = t2.name
ОНОВЛЕННЯ 2
UPDATE tableB t1
INNER JOIN tableA t2
ON t1.name = t2.name
SET t1.value = t2.value
where
пункт або змінити where
пункт, залежно від ваших потреб ..
Друга можливість -
UPDATE TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
);
.name
його індексувати в обох таблицях?
Другий варіант можливий також, якщо ви використовуєте безпечний режим оновлень (і ви отримуєте помилку, що вказує на те, що ви намагалися оновити таблицю без WHERE, що використовує стовпець KEY), додавши:
UPDATE TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
)
**where TableB.id < X**
;
Зберігайте свої дані в темп. Таблиці
Select * into tempTable from table1
Тепер оновіть стовпець
UPDATE table1
SET table1.FileName = (select FileName from tempTable where tempTable.id = table1.ID);
У моєму випадку прийняте рішення було занадто повільним. Для таблиці з 180K рядками швидкість оновлень становила близько 10 рядків в секунду. Це з індексами на елементи з'єднання.
Нарешті я вирішив свою проблему за допомогою процедури:
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
Я сподіваюся, що це допоможе комусь у майбутньому, як і мені
Якщо у вас є спільне поле в обох таблицях, то це так просто! ....
Таблиця-1 = таблиця, в якій потрібно оновити. Таблиця-2 = таблиця, з якої ви берете дані.
$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
ідеально в цій ситуації. Я також використовувавCONCAT_WS
для об'єднання найменування