2011-02-10 8 views
1

複数のテーブルの更新と奇妙な結果:のMySQL、私は2つのテーブル持って

TEST1:

id int, value int, parentId int 

とTEST2:TEST1で

id int, value int, parentId int 

、私が持っている次のレコードを:

id value parentId 
1 0  1 
2 0  1 
3 0  1 

TEST2の場合:

id value parentId 
1 0  1 

複数のテーブル機能を使用して1つの更新で2つのテーブルを更新したいと考えています。 目的は、TEST1の各レコードに+1値を追加し、TEST2のレコードに+1値を追加し、parentIdがTEST1に似ているようにすることです。

私のクエリは次のとおりです。それは私を与える

SELECT * FROM TEST1; 

UPDATE TEST1 t1 
LEFT OUTER JOIN TEST2 t2 ON t1.parentId=t2.parentId 
SET t1.value = t1.value + 1, 
    t2.value = t2.value + 1; 

はその後、私はTEST1の値が更新されていることを確認するために選択を行う

id value parentId 
1 1  1 
2 1  1 
3 1  1 

私はTEST2をチェックする:

SELECT * FROM TEST2; 

それは私を与える:

id value parentId 
1 1  1 

私は奇妙見つける何TEST2の記録はTEST1の更新は3枚のレコードとそうTEST2の更新上にあるので、私は3期待値1を持っているということです同じレコードで3回発生する必要があります。

なぜ私は3の代わりに1を取得するのですか? 3を得る正しいクエリは何ですか?

編集:私も試してみた:このクエリの後

SET @var=1; 

UPDATE TEST1 t1 
LEFT OUTER JOIN TEST2 t2 ON t1.parentId=t2.parentId 
SET t1.value = t1.value + 1, 
    t2.value = (@var:= @var + 1); 

を、t2.valueは2に等しいです!そして、私が期待していたように4。

答えて

0

RIGHT OUTER代わりに、私はここで間違っている

+0

答えていただきありがとうございます。私はちょうど試しましたが、これは何も変わりません。 –

0

たぶんLEFT OUT OF JOINを試みるが、クエリが完了するまで、あなたの更新ステートメントは、クエリの実行が完了していないため(0としてt1.valueを見になりますしてください)、それは期待された行動ではありませんか?

+0

確かにそうですが、私はこの動作を望ましくありません、それは問題です;) –

0

これはあなたが望むことをします。
あなたがしたようにTEST1とTEST2に参加しています。
TEST1上の合計集計を持つaggという名前のサブクエリに対する追加結合。

UPDATE TEST1 t1 
LEFT OUTER JOIN TEST2 t2 ON t1.parentId=t2.parentId 
LEFT OUTER JOIN (
    SELECT 
    parentId, 
    sum(value) AS sum_v 
    FROM TEST1 
    GROUP BY parentId 
) agg ON t1.parentId=agg.parentId 
SET t1.value = t1.value + 1, 
    t2.value = t2.value + agg.sum_v; 
+0

私はこれで始まった例として 'LEFT OUTER JOIN'を使用しました。実際には私はそれがすべての '内部結合 'になると思う –

+0

私の実際のケースで私は列を使用し、1ではないので私はこれを行うことはできません:例:UPDATE TEST1 t1 LEFT OUTER JOIN TEST2 t2 ON t1.parentId = t2.parentId SET t1.value = t1.value + 1、 t2.value = t2.value + t1.value; –

+0

@Jerome:集計を合計に変更します。例から '1 * 3'や' 1 + 1 + 1'を意味するかどうかは不明です。これはトリックですか? –

関連する問題