mysql-updatekolom met waarde uit een andere tabel

Ik heb twee tabellen, beide zien eruit als

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

Ik moet de waarde van valuekopiëren van tableAnaar tableBop basis van de chequenaam in elke tabel.

Enige tips voor deze UPDATE-instructie?


Antwoord 1, autoriteit 100%

Als u naast dit antwoord tableB.value dynamisch moet wijzigen volgens tableA.value, kunt u bijvoorbeeld het volgende doen:

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'

Antwoord 2, autoriteit 36%

je moet de twee tafels samenvoegen:

u wilt bijvoorbeeld de waarde van namekopiëren van tableA naar tableBwaar ze dezelfde ID

hebben

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

Antwoord 3, autoriteit 21%

Tweede mogelijkheid is,

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

Antwoord 4

   UPDATE    cities c,
          city_langs cl
    SET       c.fakename = cl.name
   WHERE     c.id = cl.city_id

Antwoord 5

De tweede optie is ook mogelijk als je de modus voor veilige updates gebruikt (en je krijgt een foutmelding die aangeeft dat je hebt geprobeerd een tabel bij te werken zonder een WHERE die een KEY-kolom gebruikt), door toe te voegen:

p>

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

Antwoord 6

Sla uw gegevens op in de tijdelijke tabel

Select * into tempTable from table1

Update nu de kolom

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

Antwoord 7

In mijn geval was de geaccepteerde oplossing gewoon te traag. Voor een tabel met 180K rijen was de snelheid van updates ongeveer 10 rijen per seconde. Dit is met de indexen op de join-elementen.

Ik heb mijn probleem eindelijk opgelost met een procedure:

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

Ik hoop dat het in de toekomst iemand zal helpen zoals het mij heeft geholpen


Antwoord 8

Als je een gemeenschappelijk veld hebt in beide tabellen, dan is het zo makkelijk !….

Tabel-1 = tabel waarin u wilt bijwerken.
Tabel-2 = tabel waar u gegevens vandaan haalt.

  1. maak een query in Tabel-1 en vind de gemeenschappelijke veldwaarde.
  2. maak een lus en vind alle gegevens uit tabel-2 volgens de waarde van tabel 1.
  3. maak opnieuw een update-query in 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();
    }
}

Other episodes