2013-02-04 5 views
0

Disons que je table1:Mysql UPDATE avec JOIN?

ID1 | COUNT 
----------- 
    1 | 0 
    2 | 0 

et table2:

ID2 | COUNT|ID1 
----------------- 
    1 | 1 | 1 
    2 | 2 | 2 
    3 | 3 | 1 

Mon but serait entrer en table1 sommes des comptes de table2 regroupés par ID1s, résultat après une update serait:

ID1 | COUNT 
----------- 
    1 | 4 
    2 | 2 

ce qui me trouble est

SELECT * 
FROM table2 t2 left outer join table1 t1 on t1.id1=t2.id1; 

renvoie 3 lignes, mais

UPDATE table2 t2 left outer join table1 t1 on t1.id1=t2.id1 
SET t1.count=t1.count+t2.count; 

mises à jour seulement 2 lignes et produit

ID1 | COUNT 
----------- 
    1 | 1 
    2 | 2 

Est-ce que quelqu'un a des idées de ce que la déclaration de la update appropriée serait? P.S. Je sais que je pourrais faire quelque chose avec SUM mais dans mon cas table1 a beaucoup plus d'enregistrement que table2, donc les sommes seraient inefficaces.

+0

voulez-vous obtenir les résultats que vous avez mentionnés? ou voulez-vous mettre à jour? –

+0

Je veux UPDATE qui laisserait table2 dans l'état que j'ai mentionné. –

Répondre

0

Vous pouvez le faire avec une sous-requête

UPDATE table1 t1 SET `t1.COUNT`=(SELECT SUM(`t2.COUNT`) 
    FROM table2 t2 WHERE t1.ID1=t2.ID1) 

Il mettra à jour votre table entière.

Si vous souhaitez le limiter à des ID spécifiques, il vous suffit de les spécifier. Ajouter:

WHERE t1.ID1=<some id> 
+0

dans mon cas, disons 1M enregistrement dans table1 et 100 enregistrements dans table2, donc le type de mise à jour que vous suggérez serait indésirable –

+0

Ajouter une clause 'WHERE' à la requête. J'ai ajouté un exemple. Si vous aviez plusieurs ID, vous pouvez utiliser 'IN()' – Cfreak

+0

Je sais que cela fonctionnerait, mais cela sera extrêmement lent dans mon cas. Je viens de mentionner que je ne veux pas utiliser sum, mais je dois apparemment le confirmer: table1 est ~ 5M lignes, table2 est ~ 200K lignes, l'expression de la jointure est ~ 10 champs. Donc même où IN sera simplement incroyablement lent. –