kolom pembaruan mysql dengan nilai dari tabel lain


221

Saya punya dua meja, keduanya tampak seperti

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

Saya perlu menyalin nilai valuedari tableAke tableBberdasarkan nama cek di setiap tabel.

Ada tips untuk UPDATEpernyataan ini ?

Jawaban:


413

Selain jawaban ini jika Anda perlu mengubah tableB.value sesuai dengan tableA.value secara dinamis dapat Anda lakukan misalnya:

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'

ya, INNER JOINsempurna dalam situasi ini. Saya juga biasa CONCAT_WSmenggabungkan nama pruduct dan SKU dari tabel lain
vladkras

2
Apakah ada cara untuk melakukan ini menggunakan alias?
Gellie Ann

Saya mencoba ini tetapi tidak berhasil, karena jumlah "baris yang terpengaruh" memberi saya 5.690, tetapi total baris adalah 5.9643, mengapa? ini permintaannya: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
Sphinx Hebat

Ini tidak berfungsi. tableB masih memiliki data sendiri tanpa mengubah. wtools.io/paste-code/bzWA Sampel berdasarkan OP dan jawaban ini.
sniffingdoggo

157

Anda harus bergabung dengan dua tabel:

misalnya Anda ingin menyalin nilai namedari tableA ke tableBtempat mereka memiliki nilai yang samaID

UPDATE tableB t1 
        INNER JOIN tableA t2 
             ON t1.id = t2.id
SET t1.name = t2.name 
WHERE t2.name = 'Joe'

PEMBARUAN 1

UPDATE tableB t1 
        INNER JOIN tableA t2 
             ON t1.id = t2.id
SET t1.name = t2.name 

PEMBARUAN 2

UPDATE tableB t1 
        INNER JOIN tableA t2 
             ON t1.name = t2.name
SET t1.value = t2.value

1
ive lebih dari 1k rekor dengan nama dan nilai yang berbeda, di sini Anda mengatakan hanya untuk catatan 1
LeoSam

Anda cukup menghapus whereklausa atau memodifikasi whereklausa tergantung pada kebutuhan Anda ..
John Woo

juga tabel B mendapat lebih banyak catatan daripada tabel A, ide saya adalah memeriksa dari tabel B ke jika nama ada, salin nilai "nilai" ke tabel B,!
LeoSam

saya tidak tahu apakah saya memahami pertanyaan Anda dengan jelas, dapatkah Anda memeriksa jawaban saya yang diperbarui?
John Woo

saya memang mencoba kedua pembaruan, yang ke-2 mengatakan efektif pada 734 baris, saya memeriksa nilai-nilai masih semua 0 tidak berubah
LeoSam

91

Kemungkinan kedua adalah,

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

7
Ya, tidak perlu bergabung dengan rumit, ketika yang kita butuhkan adalah memperbarui bidang dengan nilai dari tabel lain.
davidkonrad

8
Ya ini berfungsi dengan baik tetapi sangat, sangat lambat pada dataset besar. Jika Anda bekerja dengan tabel kecil metode ini baik-baik saja tetapi saya merekomendasikan GABUNG seperti yang ditunjukkan di atas untuk hal lain.
frijj2k

Juga, dalam skenario ini, tabel A dan B tidak dapat tabel yang sama karena kendala SQL.
Muhwu

@ frijj2k apakah ini masih lambat jika .namediindeks pada kedua tabel?
Steverino

3

Opsi kedua juga layak jika Anda menggunakan mode pembaruan aman (dan Anda mendapatkan kesalahan yang menunjukkan bahwa Anda telah mencoba memperbarui tabel tanpa WHERE yang menggunakan kolom KUNCI), dengan menambahkan:

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

Simpan data Anda di tabel temp

Select * into tempTable from table1

Sekarang perbarui kolom

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

0

Dalam kasus saya, solusi yang diterima terlalu lambat. Untuk tabel dengan baris 180K, laju pembaruan adalah sekitar 10 baris per detik. Ini dengan indeks pada elemen gabungan.

Saya akhirnya menyelesaikan masalah saya menggunakan prosedur:

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

Saya berharap ini akan membantu seseorang di masa depan seperti itu membantu saya


-4

Jika Anda memiliki bidang yang sama di kedua tabel maka itu sangat mudah! ....

Tabel-1 = tabel tempat Anda ingin memperbarui. Tabel-2 = tabel tempat Anda mengambil data.

  1. buat kueri di Tabel-1 dan temukan nilai bidang umum.
  2. buat lingkaran dan temukan semua data dari Tabel-2 sesuai dengan nilai tabel 1.
  3. lagi buat permintaan pembaruan pada tabel 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();
    }


}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.