2010-10-05 11 views
0

J'ai deux tables MySQL, voici comment ils sont structurés:MYSQL: table de mise à jour avec des valeurs d'une autre table liée

table foo(
foo_id varchar(32), 
field1 varchar(32), 
field2 varchar(32), 
bar_id varchar(32) 
); 

table bar(
    bar_id varchar(32), 
    field1 varchar(32), 
    field2 varchar(32) 
); 

Je voudrais mettre à jour la table foo d'avoir les mêmes valeurs pour field1 et field2 comme le tableau bar. J'ai essayé les deux requêtes suivantes, toutes deux fonctionnent sans erreur, mais ne me reçois pas les résultats que je veux:

UPDATE foo LEFT JOIN bar ON foo.bar_id = bar.bar_id 
SET foo.field1 = bar.field1 AND foo.field2 = bar.field2; 

également

UPDATE foo,bar SET foo.field1 = bar.field1 
AND foo.field2 = bar.field2 WHERE foo.bar_id = bar.bar_id 

mais ni travail. Qu'est-ce que j'oublie ici?

+0

Je ne trouve pas faux dans vos requêtes. Je suggère d'utiliser l'instruction select et de trouver les lignes qui seront mises à jour par la déclaration ci-dessus. comme: 'select foo. *, barre. * à partir de foo BARRE DE JOINTOIEMENT ON foo.bar_id = bar.bar_id SET foo.field1 = bar.field1 ET foo.field2 = bar.field2;' – KoolKabin

+0

@KoolKabin dans MySQL vous pouvez 't à la fois sélectionner et mettre à jour une table dans la même requête – GSto

+0

bien qu'il ne s'agissait pas de faire la sélection et la mise à jour dans la même requête. il faisait sélectionner dans une déclaration et vérifier le resultset et si le resultset est bien alors exécutez la mise à jour – KoolKabin

Répondre

1

Je pense que peut-être vous avez des problèmes avec AND; devrait être une virgule à la place. De cette façon je pense que vous mettez à jour foo.field1 pour devenir (bar.field1 AND foo.field2 = bar.field2) (conjonction logique entre non-zeroness de bar.field1 et l'égalité de field2 -s), et je suis assez sûr que ce n'est pas ce que vous vouliez dire. N'a pas testé cependant; peut-être tort.

+0

vous avez raison, c'était le problème. Bien que je trouve étrange que ce n'était pas une erreur de syntaxe de somesort dans MySQL. Je suppose que je pensais que je voulais dire SET foo.field1 = (bar.field1 ET foo.field2 = bar.field2) et définir la valeur à un booléen – GSto

+0

MySQL a casting assez permissive implicite, et '=' fonctionne à la fois pour l'attribution et comparaison en SQL, donc ... non, pas d'erreur. :) – Amadan