人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: nemutaiyo
●カテゴリ:コンピュータ インターネット
✍キーワード:hoge MySQL SELECT SET SQL
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● pahoo
●35ポイント

サブクエリを使う必要はないと思ったのですが、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;
◎質問者からの返答

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

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


2 ● chuken_kenkou
●35ポイント

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の独自機能

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ