2012-03-13 12 views
0

私のcustomerテーブルでは、refは自動インクリメントで、IDは顧客識別番号です。したがって、顧客ごとに複数のID(各顧客の履歴を形成する)が存在します。すべてのケースでlikelihoodフィールドを1に設定して、新しいレコードを作成せずに、各顧客の最新レコードを更新したいとします。MySQLの特定のレコードを選択した後の更新

UPDATE customer SET likelihood = 1 WHERE customer.ref IN (SELECT MAX(ref) FROM customer GROUP BY ID)

が、私は次のエラーを取得する:

"#1093 - You can't specify target table 'customer' for update in FROM clause"

私が間違っているつもりです

は、私はこのようなクエリが仕事をするだろうと思いましたか?

編集: いくつかのサンプルデータ(ない完全なテーブル)

ref | ID | likelihood | name 
----+----+------------+----- 
    1 | 1 |   0 | a 
    2 | 2 |   0 | b 
    3 | 1 |   0 | a 
    4 | 2 |   0 | b 
    5 | 1 |   0 | a 
    6 | 1 |   0 | a 

だから私は選ぶたい:

4 | 2 |   0 | b 
    6 | 1 |   0 | a 

とそれらを変更します。

4 | 2 |   1 | b 
    6 | 1 |   1 | a 
+0

いくつかのサンプルデータを投稿することができます... – Teja

+0

は正確に貼り付けたエラーですか?クエリがテーブル 'customer'にあるとき、エラーはテーブル 'clients'を参照しています。 – kclair

+0

@kclairの正しいメッセージ、間違ったテーブル - 編集、ありがとう – user114671

答えて

3

:あなたは、おそらく次のようなこれをやってのけるために2つのクエリが必要になります更新

でそれに書き込むことはできませんので、あなたが書いている句は、顧客テーブルから選択された場合私はそれが更新で自己結合を許すかどうか覚えていない。これを試してみてください -

UPDATE customer c1 
LEFT JOIN customer c2 
    ON c1.ID = c2.ID 
    AND c1.ref < c2.ref 
SET c1.likelihood = 1 
WHERE c2.ID IS NULL 

EDIT私は2番目のrefにIDから結合条件で使用される列を変更しました。

+0

おかげで、 'JOIN'は答えのように見えるが、それは1 – user114671

+1

1に私の謝罪ではないlikelihood'そのクエリは、'ごとに変わります。私は、結合の第2の条件でrefの代わりにIDをどのように使用し終わったか分かりません。今はうまくいくはずです。 – nnichols

+0

この作品完璧、これで私を助けるための多くのおかげで。 – user114671

2

ます選択しているテーブルを更新できないため、エラーが発生しています。

SELECT @max_ref:=max(ref) FROM customers; 
UPDATE customers SET likelihood=1 WHERE [email protected]_ref 
+0

ありがとうございますが、 "#MySQLは空の結果セットを返しました。 – user114671

+0

そして、各顧客の最新のIDを選択する方法がわかりません。 – user114671

+0

jchongも言ったように、私は本当に、のjchongの助けに感謝なくなりああ申し訳ありませんが、私は徹底的に – jeffchong07

関連する問題