cột cập nhật mysql với giá trị từ một bảng khác


221

Tôi có hai cái bàn, cả hai đều trông như

id  name  value
===================
1   Joe     22
2   Derk    30

Tôi cần sao chép giá trị valuetừ tableAđến tableBdựa trên tên kiểm tra trong mỗi bảng.

Bất kỳ lời khuyên cho UPDATEtuyên bố này ?

Câu trả lời:


413

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'

vâng, INNER JOINlà hoàn hảo trong tình huống này. Tôi cũng đã sử dụng CONCAT_WSđể hợp nhất tên pruduct và SKU từ một bảng khác
vladkras

2
Có cách nào để làm điều này bằng cách sử dụng bí danh?
Gellie Ann

Tôi đã thử điều này nhưng không thành công, vì số lượng "hàng bị ảnh hưởng" mang lại cho tôi 5690, nhưng tổng số hàng là 59643, tại sao? đây là truy vấn: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
Nhân sư vĩ đại

Điều này không hoạt động. bảngB vẫn có dữ liệu riêng không thay đổi. wtools.io/paste-code/bzWA Một mẫu dựa trên OP và câu trả lời này.
sniffingdoggo

157

bạn cần tham gia hai bảng:

ví dụ bạn muốn sao chép giá trị của nametừ bảngA vào tableBnơ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

1
ive hơn 1k bản ghi với các tên và giá trị khác nhau, ở đây câu nói của bạn chỉ dành cho bản ghi thứ nhất
LeoSam

bạn chỉ có thể xóa wheremệnh đề hoặc sửa đổi wheremệnh đề tùy theo nhu cầu của bạn ..
John Woo

còn bảng B có nhiều bản ghi hơn bảng A, ý tưởng của tôi là kiểm tra từ bảng B đến a nếu tên tồn tại sao chép giá trị của "giá trị" vào bảng B ,!
LeoSam

Tôi không biết nếu tôi hiểu rõ câu hỏi của bạn, bạn có thể kiểm tra câu trả lời cập nhật của tôi không?
John Woo

Tôi đã thử cả hai bản cập nhật, cái thứ 2 nói trên 734 hàng, tôi đã kiểm tra các giá trị vẫn không thay đổi
LeoSam

91

Khả năng thứ hai là,

UPDATE TableB 
SET TableB.value = (
    SELECT TableA.value 
    FROM TableA
    WHERE TableA.name = TableB.name
);

7
Có, không cần tham gia phức tạp, khi tất cả những gì chúng ta cần là cập nhật một trường có giá trị từ một bảng khác.
davidkonrad

8
Có, nó hoạt động tốt nhưng rất, rất chậm trên các tập dữ liệu lớn. Nếu bạn đang làm việc với các bảng nhỏ thì phương pháp này vẫn ổn nhưng tôi khuyên bạn nên THAM GIA như được hiển thị ở trên cho bất kỳ điều gì khác.
frijj2k

Ngoài ra, trong trường hợp này, bảng A và B không thể là cùng một bảng do các ràng buộc SQL.
Muhwu

@ frijj2k điều này sẽ vẫn chậm nếu .nameđược lập chỉ mục trên cả hai bảng?
Steverino

3

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**  
;

2
    UPDATE    cities c,
          city_langs cl
    SET       c.fakename = cl.name
   WHERE     c.id = cl.city_id

1

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);

0

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


-4

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.

  1. thực hiện truy vấn trong Bảng-1 và tìm giá trị trường chung.
  2. tạo một vòng lặp và tìm tất cả dữ liệu từ Bảng-2 theo giá trị của bảng 1.
  3. một lần nữa thực hiện truy vấn cập nhật trong bảng 1.

$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();
    }


}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.