colonne de mise à jour mysql avec la valeur d'une autre table


221

J'ai deux tables, les deux ressemblant

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

Je dois copier la valeur valuede tableAla tableBfonction du nom de contrôle dans chaque tableau.

Des conseils pour cette UPDATEdéclaration?

Réponses:


413

En plus de cette réponse, si vous devez modifier dynamiquement tableB.value en fonction de tableA.value, vous pouvez par exemple:

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'

oui, INNER JOINest parfait dans cette situation. J'ai également utilisé CONCAT_WSpour fusionner le nom et le SKU du
pruduct à

2
Existe-t-il un moyen de le faire en utilisant des alias?
Gellie Ann

J'ai essayé cela, mais sans succès, car le nombre de "lignes affectées" me donne 5690, mais le nombre total de lignes est 59643, pourquoi? voici la requête: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
Great Sphinx

Ça ne marche pas. tableB a toujours ses propres données sans changement. wtools.io/paste-code/bzWA Un exemple basé sur OP et cette réponse.
sniffingdoggo

157

vous devez joindre les deux tables:

par exemple, vous voulez copier la valeur de nametableA dans tableBoù ils ont le mêmeID

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

MISE À JOUR 1

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

MISE À JOUR 2

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

1
ive plus de 1k record avec différents noms et valeurs, voici votre dicton juste pour le 1er record
LeoSam

vous pouvez simplement supprimer la whereclause ou modifier la whereclause en fonction de vos besoins ..
John Woo

aussi la table B a plus d'enregistrements que la table A, mon idée est de vérifier de la table B à une si le nom existe copier la valeur de "valeur" dans la table B,!
LeoSam

je ne sais pas si j'ai bien compris votre question, pouvez-vous vérifier ma réponse mise à jour?
John Woo

j'ai essayé les deux mises à jour, la deuxième dit effeced sur 734 lignes, j'ai vérifié les valeurs toujours toutes 0 non modifiées
LeoSam

91

La deuxième possibilité est,

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

7
Oui, pas besoin de jointures compliquées, alors qu'il suffit de mettre à jour un champ avec une valeur d'une autre table.
davidkonrad

8
Oui, cela fonctionne bien mais est très, très lent sur les grands ensembles de données. Si vous travaillez avec de petites tables, cette méthode est correcte mais je recommande le JOIN comme indiqué ci-dessus pour toute autre chose.
frijj2k

De plus, dans ce scénario, les tables A et B ne peuvent pas être la même table en raison de contraintes SQL.
Muhwu

@ frijj2k serait-ce encore lent si .nameest indexé sur les deux tables?
Steverino

3

La deuxième option est également possible si vous utilisez le mode de mise à jour sécurisé (et vous obtenez une erreur indiquant que vous avez essayé de mettre à jour une table sans WHERE qui utilise une colonne KEY), en ajoutant:

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

Stockez vos données dans la table temporaire

Select * into tempTable from table1

Maintenant, mettez à jour la colonne

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

0

Dans mon cas, la solution acceptée était tout simplement trop lente. Pour une table avec 180K lignes, le taux de mises à jour était d'environ 10 lignes par seconde. C'est avec les index sur les éléments de jointure.

J'ai finalement résolu mon problème en utilisant une procédure:

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

J'espère que ça va aider quelqu'un à l'avenir comme ça m'a aidé


-4

Si vous avez un champ commun dans les deux tableaux, c'est si facile! ....

Table-1 = table où vous souhaitez mettre à jour. Table-2 = table d'où vous prenez les données.

  1. faire une requête dans le tableau-1 et trouver une valeur de champ commune.
  2. faire une boucle et trouver toutes les données du tableau 2 selon la valeur du tableau 1.
  3. effectuer à nouveau une requête de mise à jour dans le tableau 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();
    }


}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.