質問: mysqlのupdate文でサブクエリ mysqlのupdate文でサブクエリの使い方について教えて下さい。 mysqlのupdate文でサブクエリを使うと「#1093 - you can't specify target table 'exam' for update in from clause 」というエラーになってしまいます。 「あるテーブルに対してデータを追加・更新する場合、同じテーブルをサブクエリーに使えない」 「サブクエリー内のfrom句はテンポラリテーブルとして扱うことが可能」 ということはわかりましたが、これに従いsql文を変更してもうまくいきません。 どのようにsql文を作ったら良いか教えていただければと思います。 環境 php:5.1.6 mysql:5.0.77 ------具体的なsql文--------------------------------------- テーブル名:sample カラム名:date(datetime型),name,flag 上記テーブルに対して、 1.社員(列名:nameのsuzuki)の最新出勤日(列名:date)のflagを1にする 2.社員(列名:nameのsuzuki)の最新出勤日以外(列名:date)のflagを2にする という処理をしたいと思います。 まず、select文を作ってみました。 1.最新出勤日データを抽出 select * from sample where (date= (select max(date) from sample)) and name='sizili' 2.最新出勤日以外のデータを抽出 select * from sample where not (date= (select max(date) from sample)) and name='suzuki' これをupdate文に変更すると、 #1093 - you can't specify target table 'exam' for update in from clause というエラーになります。 上記をupdate文に変更 1.最新出勤日データを抽出 update sample set flag=1 where (date= (select max(date) from sample)) and name='sizili' 2.最新出勤日以外のデータを抽出 update sample set flag=2 where not (date= (select max(date) from sample)) and name='suzuki' エラー文を検索したところ下記のような情報を見つけることができました。 「仕事spot」 mysqlでサブクエリ(エラー#1093を回避する方法) http://wsjp.blogspot.com/2009/12/mysql1093.html 「あるテーブルに対してデータを追加・更新する場合、同じテーブルをサブクエリーに使えない」 「サブクエリー内のfrom句はテンポラリテーブルとして扱うことが可能」 と記載されています。 このページに掲載してあるように変更を加えてみました。 1.最新出勤日データを抽出 update sample set flag=1 where (date= (select max(date) as test_max from sample)) as text_tb and name='sizili' 2.最新出勤日以外のデータを抽出 update sample set flag=2 where not (date= (select max(date) as test_max from sample)) as test_tb and name='suzuki' これでもエラーになってしまい、うまくいきません。
回答: 掲載されてるサイトの解説をちゃんと読めば、できると思いますけど... update sample set flag=2 where date = ( select max_date from ( select max( date ) as max_date from sample where name='suzuki' ) as temp1 );