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.