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'
これでもエラーになってしまい、うまくいきません。
No.1
- 回答日時:
>1.社員(列名:nameのsuzuki)の最新出勤日(列名:date)のflagを1にする
>2.社員(列名:nameのsuzuki)の最新出勤日以外(列名:date)のflagを2にする
updateの中に同じテーブルを含んじゃいけないんだから分けるしかないでしょう
SELECT @max:=max(date) FROM sample;
UPDATE sample SET flag=(date=@max,1,2);
ご回答ありがとうございます。
UPDATEの中に同じテーブルを含むとダメだと私も思っていましたが、ネットで調べて例示したサイトに辿り着きました。
「23468」さんが回答して下さいましたが、
UPDATE sample SET flag=2 where date = (
SELECT max_date
FROM ( SELECT MAX( date ) AS max_date FROM sample WHERE name='suzuki' ) AS temp1
);
というSQL文でうまく動きました。
SQL文は奥が深いですね。
今後とも、ご回答宜しくお願いします。
No.2ベストアンサー
- 回答日時:
掲載されてるサイトの解説をちゃんと読めば、できると思いますけど…
UPDATE sample SET flag=2 where date = (
SELECT max_date
FROM ( SELECT MAX( date ) AS max_date FROM sample WHERE name='suzuki' ) AS temp1
);
ご回答ありがとうございます。
うまく動きました。
例示したサイトを参考に自分でも作ってみましたが、うまくSQL文を作れていませんでした。
うまく動かず先に進めなかったので、とても助かりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle SQL update方法 2 2022/06/22 14:07
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- 英語 L-PRF can be obtained by manual or automated metho 1 2022/04/08 09:39
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPとHTML+Xamppの掲示板で画像...
-
PHPSpreadsheetを使って関数を...
-
アマゾンのような評価の星を選...
-
phpでcookieがうまく保存されない
-
index.phpって何ですか? 具体...
-
これの対応OSを教えて下さい。p...
-
PHP8を使うと、大量のWarningが...
-
Q&Aサイトを作成していてURLの...
-
PHPのセッション有効期限について
-
ワードプレスサイト PHP8.0.25...
-
index.phpに入るには、どうすれ...
-
SFTPなどは使わないホームペー...
-
ファイルアップロードに関して...
-
ファイルアップロードの上限を...
-
php 完了画面の送信メールのコ...
-
phpのメールフォームの完了画面...
-
入力した部分を表示させたまま...
-
phpでPEAR::DBを使っているので...
-
awsにApacheとPHPを入れて、何...
-
掲示板のセキュリティについて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHP+MySQLで月ごとの数量を表...
-
PHPとMysqlを使用した集計表の...
-
【PL/SQL】DATE型の時刻の表示...
-
JOINを使った文で、date > now();
-
日替わりメッセージを表示させ...
-
更新履歴を古い順に表示させる...
-
UNIXの時間はどう変更すれ...
-
掲載日と更新日の管理の仕方
-
現時刻とjson(オブジェクト形...
-
MySQLのUPDATE文でサブクエリ
-
php mysql データ登録
-
SQLローダーCSV取込で、囲み文...
-
テーブルの最後(最新)のレコー...
-
select文の実行結果に空白行を...
-
<SQL>重複しているデータの場合...
-
エクセルのソートについて
-
【PL/SQL】FROM区に変数を使う方法
-
単一グループのグループ関数で...
-
count関数の値をwhere句で使用...
-
複数のテーブルから値を合計出...
おすすめ情報