dポイントプレゼントキャンペーン実施中!

すみません、MySQLのSQL文で教えてください。
以下のSQL文を実行すると

UPDATE overflag c, asinprice d SET d.priceCheckUS = TRUE WHERE c.asin=d.asin AND c.priceOverUS=0 LIMIT 1;

ERROR 1221 (HY000): Incorrect usage of UPDATE and LIMIT

というエラーが出力されます。

UPDATE asinprice d SET d.priceCheckUS = TRUE WHERE d.asin='111' OR d.asin='000' LIMIT 1;

は実行できました。
複数テーブルだと実行できないように理解しましたが、何が問題か教えてください。

よろしくお願いします。

A 回答 (1件)

>複数テーブルだと実行できないように理解しましたが、



そうですね

>何が問題か教えてください。

そもそもupdate でlimitをすること自体がイレギュラーな処理です
where句で厳密に条件を提示するべきですね

とはいえ、以下のようにリレーションする部分をあらかじめ処理したうえで
その結果をうけて処理するればできないことはなさそうです。

//元データ
create table tbl1(id int not null primary key,data int,flag tinyint not null);
insert into tbl1(id,data) values(1,11),(2,12),(3,13),(5,15),(6,16);
create table tbl2(id int not null primary key,data int,flag tinyint not null);
insert into tbl2(id,data) values(1,21),(2,22),(4,24),(5,25);

//とりあえず確認
select * from tbl1;
→flagはすべて0

//limitしないupdate
update tbl1,tbl2 set tbl1.flag=1 where tbl1.id=tbl2.id;

//確認
select * from tbl1;
→3件flagが1になる

//1回クリア
update tbl1 set tbl1.flag=0;
select * from tbl1;
→flagはすべて0

//tbl1のid順で上位1件をupdate
update tbl1 set flag=1 where id in
(select * from (select tbl1.id from tbl1 inner join tbl2 on tbl1.id=tbl2.id order by tbl1.id asc limit 1) as sub);

//確認
select * from tbl1;
→1件だけflagが1になる
※サブクエリはlimitを利用できないので一度ダミーで処理をいれる
    • good
    • 1
この回答へのお礼

早々の回答ありがとうございます。

すごい!

できました。
意味は理解出来てませんが、エラーは消えて動いてそうです。
SELECT分で絞っているんですね。
subの使い方はあまり理解出来てませんが、Postgreは不要で出来ているようなので
SELECTで絞るようなSQL文を記載しましたが、ダメでした。。。

とにかく。ありがとうございます。助かりましたm(_ _)m
(もう少し他の方法も待って、なさそうならベストアンサーにさせてもらいます。)

お礼日時:2015/01/06 21:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!