başka bir tablodan değeri olan mysql güncelleme sütunu


221

İki masam var, ikisi de benziyor

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

Ben değerini kopyalamanız gerekir valuedan tableAiçin tableBher tabloda onay adına göre.

Bu UPDATEifade için ipucu var mı?

Yanıtlar:


413

Bu cevaba ek olarak tableB.value değerini tableA.valure'a göre dinamik olarak değiştirmeniz gerekirse, örneğin şunları yapabilirsiniz:

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'

evet, INNER JOINbu durumda mükemmel. Ben de CONCAT_WSbaşka bir tablodan
pruduct

2
Takma adları kullanarak bunu yapmanın bir yolu var mı?
Gellie Ann

Bunu denedim ama başarılı olamadım, çünkü "etkilenen satırlar" sayısı bana 5690 veriyor, ancak toplam satırlar 59643, neden? Bu sorgu: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üyük Sfenks

Bu işe yaramıyor. tableB'nin kendi verileri değişmeden hala var. wtools.io/paste-code/bzWA OP ve bu cevaba dayanan bir örnek.
sniffingdoggo

157

iki tabloya katılmanız gerekir:

örneğin name, tableA öğesinin değerini tableBaynı oldukları yere kopyalamak istiyorsunuzID

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

GÜNCELLEME 1

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

GÜNCELLEME 2

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

1
ive farklı isimler ve değer ile 1k üzerinde kayıt, burada sadece 1. kayıt için söyleyerek
LeoSam

sadece wherecümleyi kaldırabilir veya whereihtiyaçlarınıza göre cümleyi değiştirebilirsiniz ..
John Woo

Ayrıca tablo B tablo A daha fazla kayıt var, benim fikrim tablo B kontrol bir isim varsa "değer" değerini tablo B kopyalayın!
LeoSam

Sorunuzu açıkça anladım mı bilmiyorum, güncellenmiş cevabımı kontrol edebilir misiniz?
John Woo

Ben her iki güncelleme denedin mi, 2. biri 734 satır etkilendi diyor, ben hala tüm 0 değişmedi değerleri kontrol
LeoSam

91

İkinci olasılık,

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

7
Evet, karmaşık birleştirmelere gerek yok, tek ihtiyacımız olan bir alanı başka bir tablodaki değerle güncellemek.
davidkonrad

8
Evet, bu iyi çalışıyor ancak büyük veri kümelerinde çok, çok yavaş. Küçük tablolar ile çalışıyorsanız bu yöntem gayet iyi ama yukarıda gösterildiği gibi başka bir şey için JOIN öneririz.
frijj2k

Ayrıca, bu senaryoda, SQL kısıtlamaları nedeniyle A ve B tabloları aynı tablo olamaz.
Muhwu

@ frijj2k .nameher iki tabloda da dizin oluşturulmuşsa bu hala yavaş olur mu?
Steverino

3

İkinci seçenek, güvenli güncellemeler modunu kullanıyorsanız (ve KEY sütunu kullanan bir WHERE olmadan bir tabloyu güncellemeye çalıştığınızı belirten bir hata alıyorsanız) da mümkündür:

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

Verilerinizi geçici tabloda depolayın

Select * into tempTable from table1

Şimdi sütunu güncelleyin

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

0

Benim durumumda, kabul edilen çözüm çok yavaştı. 180K sıralı bir tablo için güncelleme hızı saniyede yaklaşık 10 sıra idi. Bu, birleştirme öğelerindeki dizinlerle ilgilidir.

Sonunda sorunumu bir prosedür kullanarak çözdüm:

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

Umarım gelecekte bana yardım etmiş gibi yardımcı olur


-4

Her iki tabloda ortak alanınız varsa o zaman çok kolay! ....

Tablo-1 = güncellemek istediğiniz tablo. Tablo-2 = veri alacağınız tablo.

  1. Tablo-1'de sorgu yapabilir ve ortak alan değerini bulur.
  2. bir döngü yapın ve tablo 1 değerine göre Tablo-2'deki tüm verileri bulun.
  3. yine tablo 1'de güncelleme sorgusu yapın.

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


}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.