Câu trả lời:
Ngoài câu trả lời này nếu bạn cần thay đổi bảngB.value theo bảngA.value một cách linh hoạt, bạn có thể làm ví dụ:
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
bạn cần tham gia hai bảng:
ví dụ bạn muốn sao chép giá trị của name
từ bảngA vào tableB
nơi chúng có cùngID
UPDATE tableB t1
INNER JOIN tableA t2
ON t1.id = t2.id
SET t1.name = t2.name
WHERE t2.name = 'Joe'
CẬP NHẬT 1
UPDATE tableB t1
INNER JOIN tableA t2
ON t1.id = t2.id
SET t1.name = t2.name
CẬP NHẬT 2
UPDATE tableB t1
INNER JOIN tableA t2
ON t1.name = t2.name
SET t1.value = t2.value
where
mệnh đề hoặc sửa đổi where
mệnh đề tùy theo nhu cầu của bạn ..
Khả năng thứ hai là,
UPDATE TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
);
.name
được lập chỉ mục trên cả hai bảng?
Tùy chọn thứ hai cũng khả thi nếu bạn đang sử dụng chế độ cập nhật an toàn (và bạn đang gặp lỗi cho biết bạn đã cố cập nhật bảng mà không có WHERE sử dụng cột KEY), bằng cách thêm:
UPDATE TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
)
**where TableB.id < X**
;
Lưu trữ dữ liệu của bạn trong bảng tạm thời
Select * into tempTable from table1
Bây giờ cập nhật cột
UPDATE table1
SET table1.FileName = (select FileName from tempTable where tempTable.id = table1.ID);
Trong trường hợp của tôi, giải pháp được chấp nhận là quá chậm. Đối với một bảng có 180K hàng, tốc độ cập nhật là khoảng 10 hàng mỗi giây. Đây là với các chỉ mục trên các yếu tố tham gia.
Cuối cùng tôi đã giải quyết vấn đề của mình bằng thủ tục:
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
Tôi hy vọng nó sẽ giúp được ai đó trong tương lai như nó đã giúp tôi
Nếu bạn có trường chung trong cả hai bảng thì thật dễ dàng! ....
Bảng-1 = bảng nơi bạn muốn cập nhật. Bảng-2 = bảng nơi bạn lấy dữ liệu.
$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
là hoàn hảo trong tình huống này. Tôi cũng đã sử dụngCONCAT_WS
để hợp nhất tên pruduct và SKU từ một bảng khác