161 votes

Mettre à jour plusieurs tables dans MySQL avec LEFT JOIN

J'ai deux tables, et que vous voulez mettre à jour les champs dans le T1 pour toutes les lignes dans un LEFT JOIN.

Pour un exemple simple, mise à jour toutes les lignes du résultat suivant:

SELECT T1.* FROM T1 LEFT JOIN T2 ON T1.id = T2.id WHERE T2.id IS NULL  

Le manuel MySQL stipule que:

Plusieurs mise à JOUR la table des déclarations pouvez utiliser n'importe quel type de jointure autorisés dans les instructions SELECT, tels que LEFT JOIN.

Mais je ne trouve pas la bonne syntaxe pour le faire que dans la documentation de multiples tables de mise à JOUR.

Quelle est la bonne syntaxe?

306voto

Quassnoi Points 191041
UPDATE  t1
LEFT JOIN
        t2
ON      t2.id = t1.id
SET     t1.col1 = newvalue
WHERE   t2.id IS NULL

Notez que pour un SELECT il serait plus efficace d'utiliser NOT IN / NOT EXISTS syntaxe:

SELECT  t1.*
FROM    t1
WHERE   t1.id NOT IN
        (
        SELECT  id
        FROM    t2
        )

Voir l'article dans mon blog pour les détails de performance:

Malheureusement, MySQL ne permet pas l'utilisation de la table cible dans une sous-requête dans une UPDATE déclaration, c'est pourquoi vous aurez besoin de coller à la moins efficace, LEFT JOIN de la syntaxe.

27voto

theprivileges Points 193

La même chose peut être appliqué à un scénario où les données ont été normalisées, mais maintenant, vous voulez une table de valeurs que l'on retrouve dans une troisième table. Ce qui suit va vous permettre de mettre à jour une table avec des informations provenant d'une troisième table qui est aimé par une seconde table.

UPDATE t1
LEFT JOIN
 t2
ON 
 t2.some_id = t1.some_id
LEFT JOIN
 t3 
ON
 t2.t3_id = t3.id
SET 
 t1.new_column = t3.column;

Ce serait utile dans le cas où vous aviez des utilisateurs et des groupes, et vous souhaitez qu'un utilisateur d'être en mesure d'ajouter leurs propres variation du nom du groupe, donc à l'origine que vous souhaitez importer le groupe existant noms dans le champ dans lequel l'utilisateur va être en mesure de le modifier.

4voto

DNS Points 377
<pre><code></code><p><pre><code></code></pre><p>et arriver à ce résultat :</p><pre><code></code></pre><p>où est accepté qu’un seul champ de la Table B, mais je vais venir à ce résultat :</p><pre><code></code></pre></pre>

0voto

guest Points 11
UPDATE `Table A` a
SET a.`text`=(
        SELECT group_concat(b.`B-num`,' from ',b.`date` SEPARATOR ' / ') 
        FROM `Table B` b WHERE (a.`A-num`=b.`A-num`)
)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X