MySQLの副問い合わせについて教えてください。


以下のサイトを見て、
「サブクエリの中で更新するテーブルを指定できない」ということを知りました。

実行したい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

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2009/06/10 18:50:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:pahoo No.1

回答回数5960ベストアンサー獲得回数633

ポイント35pt

サブクエリを使う必要はないと思ったのですが、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;
id:nemutaiyo

ありがとうございます。pahooさんが2つと書かれているのであれば、安心して2つのSQLで実装できます。(私だけ知らない。ということがないか心配だったのです)

それと。。「サブクエリを使う必要はないと思ったのですが」とか、初めて見た「@mm」とかまだまだ知らないことがたくさんありそうです。勉強します!

2009/06/03 19:26:22
id:chuken_kenkou No.2

回答回数722ベストアンサー獲得回数54

ポイント35pt

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
;
id:nemutaiyo

ありがとうございます。(データまで用意して頂き恐縮です。)。早速試してみます!

>MySQLの独自機能

..了解です。勉強しなきゃ

2009/06/03 21:37:55

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません