2012-02-15 14 views
1

私はこのような何かをしたいが、私はちょうどいけないようだと更新することができます。のMySQL - INNER SELECT

UPDATE products p2 
SET 
manufacturer = 
(
SELECT manufacturer 
FROM products p, manufacturers m, etc. 
WHERE 
...other stuff... 
p.name LIKE CONCAT('%',m.name,'%')  
AND p.id = p2.id 
) 
WHERE manufacturer = 0 

エラーは次のとおりです。 #1093 - あなたはターゲット表を指定することはできませんP2」 'for FROM句の更新

問題は、私はテーブルに製造元のフィールドがありますが、製造元のフィールドの代わりに製造元の名前の一部が製造元の文字列にあるため、製造元のIDを取得する必要があります。 product_nameを更新し、製品テーブルのメーカーIDを更新します。

私は2つのステップでこれを行うことができましたが、IDを1つにするのが好きです。

+0

AND p.id = p2.idここではp2とは何ですか? –

答えて

2

http://dev.mysql.com/doc/refman/5.0/en/subquery-errors.htmlにこの同じエラーに関するコメントがあります。"サブクエリで同じデータを同時に読み取っている場合、MySQLはテーブルのデータを更新または削除できません。"レコードが正しく結合されていることを確認し、まず

UPDATE products p 
    JOIN manufacturers m 
    ON LOCATE(p.name, m.name) > 0 
SET p.manufacturer = m.id; 

...しかし - -

+0

thxしかし、私はそれを別の方法で作ることができるという考えを持っていますか? –

+0

私は、おそらく[Cursors](http://dev.mysql.com/doc/refman/5.0/en/cursors.html)を使用して、あなたの単一のステートメントをそれらのシーケンスで書き直さなければならないと信じています。 –

+0

カーソルは一度も使われていませんが、私は見ています。 –

3

この文字列で検索してください

SELECT * FROM products p 
    JOIN manufacturers m 
    ON LOCATE(p.name, m.name) > 0 -- bind records in two tables 
0

クエリのこの種のために働くかどうかを確認します

UPDATE products p2 INNER JOIN manufacturers m ON m.product_id = p2.id AND p2.name LIKE CONCAT('%',m.name,'%') SET manufacturer = YOURVALUE 

上記のクエリを変更する必要があるかもしれません。これは私の前提に基づいて書いたものです

0

動作一つのテーブルに例:

このステートメントは、既にマッチングDRAFTレコードが存在する場合 をDEAKTIVする全てAKTIVレコードを移動:

update table1 fa inner join table1 fe on (fa.datum = fe.datum and fa.firmenid = fe. firmenid and fe.status = 'DRAFT') 
set fa.status = 'DEACTIV' 
where fa.firmenid = '+49151506292' and fa.status = 'ACTIV'; 

単にupdtae I上記のステートメントを実行した後DRAFT-record ton ACTIVとコミット