以下のサイトを見て、
「サブクエリの中で更新するテーブルを指定できない」ということを知りました。
実行したいSQLは以下です。できれば1回のSQLで済ませたいです。(一度最小値を取得してから、更新SQLを投げる。というのは避けたいです)
1回のSQLではできないのでしょうか?アドバイスお願いします。
MySQLは初心者ですので、MySQLではこのような副問い合わせはしない。という常識があるのであれば、
それを教えてください。(それなら納得して、2回投げます)
【エラーになったSQL】
update person set status=1, mail_address='hoge@hoge.com' where
id = ( select min(id) from person where mail_address is null)
---以下補足
【MySQLのバージョン】
MySQL 5.1(副問い合わせするために、わざわざバージョンアップしたのに!!)
【テーブル名】
person
【カラム】
id
status
mail_address
【参考URL】
http://dev.mysql.com/doc/refman/4.1/ja/subquery-errors.html
http://futuremix.org/2007/08/mysql-update-with-subquery
サブクエリを使う必要はないと思ったのですが、min だけが厄介ですね。limit 句では、min(id) が複数あると矛盾しますし。
というわけで、2つのSQL文になってしまうのですが(苦笑)、以下でどうでしょ。
select (@mm:=min(id)) from person; update person set status=1, mail_address='hoge@hoge.com' where id = @mm and mail_address is null;
MySQLの独自機能である、「複数表のupdate」を応用する方法があります。
update文は、次のような指定です。
update person as x, (select min(id) as id from person where mail_address is null) as y set x.status=1, x.mail_address='hoge@hoge.com' where x.id = y.id
以下に貼り付けておきますので、お試しください。
1.テスト (1)表定義 drop table if exists person; create table person (id int primary key auto_increment ,status tinyint ,mail_address varchar(50) ); (2)テストデータ格納 insert into person values (null,0,null) ,(null,0,null) ,(null,1,null) ,(null,1,null) ,(null,0,'abc@xyz') ,(null,0,'def@xyz') ,(null,1,'ghi@xyz') ,(null,1,'jkl@xyz') ,(null,0,null) ,(null,0,null) ,(null,1,null) ,(null,1,null) ,(null,0,'abc@xyz') ,(null,0,'def@xyz') ,(null,1,'ghi@xyz') ,(null,1,'jkl@xyz') ; (3)検索で確認 select * from person order by id ; (4)更新・・・最初に提示したupdate文 update person as x, (select min(id) as id from person where mail_address is null) as y set x.status=1, x.mail_address='hoge@hoge.com' where x.id = y.id ;
ありがとうございます。(データまで用意して頂き恐縮です。)。早速試してみます!
>MySQLの独自機能
..了解です。勉強しなきゃ
ありがとうございます。pahooさんが2つと書かれているのであれば、安心して2つのSQLで実装できます。(私だけ知らない。ということがないか心配だったのです)
それと。。「サブクエリを使う必要はないと思ったのですが」とか、初めて見た「@mm」とかまだまだ知らないことがたくさんありそうです。勉強します!