0

以前の質問からの回答を使用して、この更新クエリの多くのバージョンを試しましたが、機能しないようです。私が持っている最新のものは、影響を受ける0行を返します。

このクエリを実行すると、2017 年の結果が得られます (これが必要です)。

SELECT *
FROM  table_1 t1
INNER JOIN table_2 t2 ON t1.company = t2.company
WHERE t1.user = 123 AND t2.group_id = 3

しかし、このような更新クエリを実行したい

UPDATE table_1 AS t1
INNER JOIN table_2 as t2
ON t1.company = t2.company
SET t1.user = t2.user
WHERE t1.user = 123 AND t2.group_id = 3

しかし、影響を受ける行は0です

この更新クエリが、クエリ 1 で返される 2017 レコードを更新しないのはなぜですか?

4

2 に答える 2

1

エラーがあるため、selectクエリが返す行が多すぎると思います。

INNER JOIN table_2 t2 ON t2.company = t2.company

私はあなたが欲しいと思います:

INNER JOIN table_2 t2 ON t1.company = t2.company
于 2012-09-14T15:09:03.853 に答える
0

更新クエリを実行する前に、table_1.user と table_2.user の値が実際に異なることを確信していますか? MySQL は、選択および検査された行数ではなく、実際に変更された行数を報告します。

最初にこのクエリを実行して、実際に更新が必要な 2017 行の数を確認してください。

SELECT *
FROM  table_1 t1
INNER JOIN table_2 t2 ON t1.company = t2.company
WHERE t1.user = 123 AND t2.group_id = 3
AND t1.user <> t2.user

アップデート

これは、データ型が比較できるほど類似しているが、table_2.user の値を table_1.user に割り当てるほどではない場合に発生する可能性があります。その場合、MySQL は警告 (「行 xxx の列 'user' に対して調整された範囲外の値」) を発行しますが、それ以外の場合はクエリを成功させます。クエリを再度実行すると、値がまだ異なることが示されますが、実際に t1.user に保存されているものは変更されません。

変更が必要な行のみに一致するように更新クエリを変更し、これをコマンド ラインから実行すると、MySQL は何が起こっているかを正確に通知します。

mysql> UPDATE table_1 AS t1
    -> INNER JOIN table_2 as t2
    -> ON t1.company = t2.company
    -> SET t1.user = t2.user
    -> WHERE t1.user = 123 AND t2.group_id = 3
    -> AND t1.user <> t2.user
Query OK, 0 rows affected, 2017 warnings (0.01 sec)
Rows matched: 2017  Changed: 0  Warnings: 2017

Rows matched: 2017更新が必要な 2017 行があったことを示します (値が既に正しい場合、これは 0 になります)

Changed: 0コマンドにもかかわらず、それらのどれも実際には異なる値にならなかったことを意味しますSET t1.user = t2.user

Warnings: 2017は、何か問題が発生したことを示しSHOW WARNINGSており、それが何であったかを調べるためにクエリを発行する必要があります。この場合、smallint と integer に格納できるデータの不一致は、データが table_1 で切り捨てられたことを意味します。

于 2012-09-14T15:12:53.050 に答える