MySQL-Aktualisierungsspalte mit Wert aus einer anderen Tabelle


221

Ich habe zwei Tische, die beide so aussehen

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

Ich muss den Wert von valuevon tableAbis tableBbasierend auf dem Prüfnamen in jeder Tabelle kopieren .

Irgendwelche Tipps für diese UPDATEAussage?

Antworten:


413

Zusätzlich zu dieser Antwort können Sie beispielsweise Folgendes tun, wenn Sie tableB.value entsprechend tableA.value dynamisch ändern müssen:

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'

Ja, INNER JOINist perfekt in dieser Situation. Ich habe auch CONCAT_WSden Produktnamen und die SKU aus einer anderen Tabelle zusammengeführt
vladkras

2
Gibt es eine Möglichkeit, dies mit Aliasen zu tun?
Gellie Ann

Ich habe dies versucht, aber keinen Erfolg, da die Anzahl der "betroffenen Zeilen" 5690 ergibt, aber die Gesamtzahl der Zeilen 59643 beträgt. Warum? Dies ist die Frage: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
Große Sphinx

Das funktioniert nicht. Tabelle B hat immer noch eigene Daten, ohne sich zu ändern. wtools.io/paste-code/bzWA Ein Beispiel basierend auf OP und dieser Antwort.
sniffingdoggo

157

Sie müssen die beiden Tabellen verbinden:

Sie möchten beispielsweise den Wert von nameaus Tabelle A an die Stelle kopieren, an der tableBsie denselben Wert habenID

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

UPDATE 1

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

UPDATE 2

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

1
ive über 1k Datensatz mit verschiedenen Namen und Wert, hier Ihr Sprichwort nur für 1. Datensatz
LeoSam

Sie können die whereKlausel einfach entfernen oder ändern where, je nach Ihren Anforderungen.
John Woo

Auch Tabelle B hat mehr Datensätze als Tabelle A, meine Idee ist, von Tabelle B nach a zu prüfen, ob der Name existiert. Kopieren Sie den Wert von "Wert" in Tabelle B ,!
LeoSam

Ich weiß nicht, ob ich Ihre Frage klar verstanden habe. Können Sie meine aktualisierte Antwort überprüfen?
John Woo

Ich habe beide Updates versucht, das zweite sagt, auf 734 Zeilen wirksam, ich überprüfte Werte immer noch alle 0 nicht geändert
LeoSam

91

Die zweite Möglichkeit ist:

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

7
Ja, komplizierte Verknüpfungen sind nicht erforderlich, wenn wir lediglich ein Feld mit einem Wert aus einer anderen Tabelle aktualisieren müssen.
Davidkonrad

8
Ja, das funktioniert gut, ist aber bei großen Datenmengen sehr, sehr langsam. Wenn Sie mit kleinen Tabellen arbeiten, ist diese Methode in Ordnung, aber ich empfehle JOIN wie oben gezeigt für alles andere.
frijj2k

In diesem Szenario können Tabelle A und B aufgrund von SQL-Einschränkungen nicht dieselbe Tabelle sein.
Muhwu

@ frijj2k Wäre dies immer noch langsam, wenn .namees auf beiden Tabellen indiziert ist?
Steverino

3

Die zweite Option ist auch möglich, wenn Sie den sicheren Aktualisierungsmodus verwenden (und eine Fehlermeldung angezeigt wird, dass Sie versucht haben, eine Tabelle ohne ein WHERE zu aktualisieren, das eine KEY-Spalte verwendet), indem Sie Folgendes hinzufügen:

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

Speichern Sie Ihre Daten in einer temporären Tabelle

Select * into tempTable from table1

Aktualisieren Sie nun die Spalte

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

0

In meinem Fall war die akzeptierte Lösung einfach zu langsam. Für eine Tabelle mit 180 KB Zeilen betrug die Aktualisierungsrate etwa 10 Zeilen pro Sekunde. Dies gilt für die Indizes der Join-Elemente.

Ich habe mein Problem schließlich mithilfe eines Verfahrens gelöst:

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

Ich hoffe, es wird in Zukunft jemandem helfen, so wie es mir geholfen hat


-4

Wenn Sie in beiden Tabellen ein gemeinsames Feld haben, ist es so einfach! ....

Tabelle 1 = Tabelle, in der Sie aktualisieren möchten. Tabelle 2 = Tabelle, aus der Sie Daten entnehmen.

  1. Stellen Sie eine Abfrage in Tabelle 1 und suchen Sie den allgemeinen Feldwert.
  2. Machen Sie eine Schleife und finden Sie alle Daten aus Tabelle 2 gemäß dem Wert in Tabelle 1.
  3. Führen Sie erneut eine Aktualisierungsabfrage in Tabelle 1 durch.

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


}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.