คอลัมน์อัพเดท MySQL พร้อมค่าจากตารางอื่น


221

ฉันมีสองตารางทั้งสองดูเหมือน

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

ฉันต้องการคัดลอกค่าvalueจากtableAเป็นtableBตามชื่อเช็คในแต่ละตาราง

มีคำแนะนำสำหรับUPDATEคำชี้แจงนี้ไหม?

คำตอบ:


413

นอกจากคำตอบนี้หากคุณต้องการเปลี่ยน 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'

ใช่INNER JOINมันสมบูรณ์แบบในสถานการณ์นี้ ฉันเคยCONCAT_WSรวมชื่อ
pruduct

2
มีวิธีทำเช่นนี้โดยใช้นามแฝงหรือไม่?
Gellie Ann

ฉันลองทำสิ่งนี้ แต่ไม่ประสบความสำเร็จเพราะการนับ "จำนวนแถวที่ได้รับผลกระทบ" ทำให้ฉันมี 5690 แต่จำนวนแถวทั้งหมดคือ 59643 ทำไม นี่คือข้อความค้นหา: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
Great Sphinx

มันใช้งานไม่ได้ tableB ยังคงมีข้อมูลของตัวเองโดยไม่มีการเปลี่ยนแปลง wtools.io/paste-code/bzWAตัวอย่างอ้างอิงจาก OP และคำตอบนี้
sniffingdoggo

157

คุณต้องเข้าร่วมสองตาราง:

ตัวอย่างเช่นคุณต้องการคัดลอกค่า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

1
บันทึกมากกว่า 1k ด้วยชื่อและค่าที่ต่างกันนี่คือคำพูดของคุณสำหรับบันทึก 1
LeoSam

คุณสามารถลบwhereประโยคหรือแก้ไขwhereประโยคได้ตามความต้องการของคุณ ..
John Woo

นอกจากนี้ตาราง B ยังได้รับการบันทึกมากกว่าตาราง A ความคิดของฉันคือตรวจสอบจากตาราง B ไปยัง a หากชื่อมีอยู่ให้คัดลอกค่า "value" ไปยังตาราง B!
LeoSam

ฉันไม่รู้ว่าฉันเข้าใจคำถามของคุณชัดเจนหรือไม่คุณสามารถตรวจสอบคำตอบที่อัปเดตของฉันได้หรือไม่
John Woo

ฉันลองปรับปรุงทั้งสองอันตัวที่สองบอกว่ามีแถว 734 แถวฉันตรวจสอบค่าแล้วว่ายังคงไม่เปลี่ยนแปลง 0 ทั้งหมด
LeoSam

91

ความเป็นไปได้ที่สองคือ

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

7
ใช่ไม่จำเป็นต้องเข้าร่วมที่ซับซ้อนเมื่อทั้งหมดที่เราต้องการคือการปรับปรุงเขตข้อมูลที่มีค่าจากตารางอื่น
davidkonrad

8
ใช่มันใช้งานได้ดี แต่ชุดข้อมูลขนาดใหญ่ช้ามาก หากคุณกำลังทำงานกับตารางเล็ก ๆ วิธีนี้ใช้ได้ แต่ฉันแนะนำ JOIN ดังที่แสดงด้านบนสำหรับสิ่งอื่น
frijj2k

นอกจากนี้ในสถานการณ์นี้ตาราง A และ B ไม่สามารถเป็นตารางเดียวกันได้เนื่องจากข้อ จำกัด ของ SQL
Muhwu

@ frijj2k สิ่งนี้จะยังคงช้าถ้า.nameมีการจัดทำดัชนีในตารางทั้งสอง?
Steverino

3

ตัวเลือกที่สองเป็นไปได้เช่นกันหากคุณกำลังใช้โหมดการอัพเดทที่ปลอดภัย (และคุณได้รับข้อผิดพลาดที่ระบุว่าคุณได้พยายามอัปเดตตารางโดยไม่ใช้ตำแหน่งที่ใช้คอลัมน์ KEY) โดยการเพิ่ม:

UPDATE TableB  
SET TableB.value = (  
SELECT TableA.value  
    FROM TableA  
    WHERE TableA.name = TableB.name  
)  
**where TableB.id < X**  
;


1

เก็บข้อมูลของคุณในตารางชั่วคราว

Select * into tempTable from table1

ตอนนี้อัปเดตคอลัมน์

 UPDATE table1
    SET table1.FileName = (select FileName from tempTable where tempTable.id = table1.ID);

0

ในกรณีของฉันทางออกที่ยอมรับก็ช้าเกินไป สำหรับตารางที่มีแถว 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

ฉันหวังว่ามันจะช่วยให้ใครบางคนในอนาคตเหมือนจะช่วยฉัน


-4

หากคุณมีเขตข้อมูลทั่วไปในตารางทั้งสองแล้วมันง่ายมาก! ....

Table-1 = ตารางที่คุณต้องการอัพเดท Table-2 = ตารางที่คุณไม่รับข้อมูล

  1. ค้นหาในตารางที่ 1 และค้นหาค่าฟิลด์ทั่วไป
  2. สร้าง loop และค้นหาข้อมูลทั้งหมดจาก Table-2 ตามค่า table 1
  3. สร้างคิวรีอัปเดตอีกครั้งในตารางที่ 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();
    }


}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.