MySQL ver.5.0.95です。
PHPからSQL文を作ってDBへインサートしているのですが
重複した値が合った場合はupdateするように書いています。
TBL1には
|id |string |count
1 aaa 0
2 bbb 3
3 ccc 1
TBL2には
|id2 |string2 |count2
1 aaa 0
2 bbb 2
3 ccc 1
実際はもう少し複雑ですが、こういう感じでデータが入ってるとします。
このとき、TBL1のそれぞれをインサート若しくはアップデートするのに
TBL2の同一IDのものの、count2の状態によって場合分けしたく
同一IDのcount2が1以上なら変更しない、という風にするため以下のように書いたのですが
insert into TBL1 values
(1, "aaa", 3),
(2, "bbb", 3),
(3, "ccc", 3),
(4, "ddd", 3)
on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = values(id)) >=1 THEN count ELSE count + values(count) END;
#1064 - You have an error in your SQL syntax;というエラーになって出来ません。
WHENの中のサブクエリで、where id2 = values(id) 恐らくこの文がダメなようです。
例えば決め撃ちで1つ1つ書くと通ります。
insert into TBL1 values(1, "aaa", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 1) >=1 THEN count ELSE count + values(count) END;
insert into TBL1 values(2, "bbb", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 2) >=1 THEN count ELSE count + values(count) END;
insert into TBL1 values(3, "ccc", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 3) >=1 THEN count ELSE count + values(count) END;
insert into TBL1 values(4, "ddd", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 4) >=1 THEN count ELSE count + values(count) END;
これをエラーになったような文に変えて1文にまとめたいのですが、無理でしょうか?
あとそもそもこれをまとめたほうが速いと思ってそうしたいのですが、
変わらないのなら1文1文;でつなげて書くやり方でいこうと思っています。
まとめると速くなることはあるでしょうか?
No.1ベストアンサー
- 回答日時:
バルク処理でupdateまでやってしまうとなると一度テンポラリテーブルを
作った方がよいかも
//元データ
create table TBL1(id int not null unique key,string varchar(10),count int);
insert into TBL1 values(1,'aaa',0),(2,'bbb',3),(3,'ccc',1);
create table TBL2(id2 int not null unique key,string2 varchar(10),count2 int);
insert into TBL2 values(1,'aaa',0),(2,'bbb',2),(3,'ccc',1);
//処理
create temporary table tmp(id3 int,string3 varchar(10),count3 int);
insert into tmp values (1,'aaa',3),(2,'bbb',3),(3,'ccc',3),(4,'ddd',3);
insert into TBL1
select id3,string3,count3 from tmp
left join TBL2 on id3=id2 where count2 is null or count2<1
on duplicate key update count=count3;
//テンポラリを使わない場合はunionでデータを羅列?
insert into TBL1
select id3,string3,count3
from (select 1 as id3,'aaa' as string3,3 as count3 union select 2,'bbb',3 union select 3,'ccc',3 union select 4,'ddd',3) as list
left join TBL2 on id3=id2 where count2 is null or count2<1
on duplicate key update count=count3;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 次の時間帯の勝率の合計を求めるSQL文 1 2023/07/04 17:12
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- Visual Basic(VBA) エクセル マクロ(A1:A10)までの中で一番多く出た数字をB10に表示 6 2023/04/25 17:01
- PHP プログラムコードを入力する場合改行してもいいですか? 2 2022/10/02 16:05
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Visual Basic(VBA) Sheet3から2つの条件でオートフィルターで抽出した個数をSheet2へ入力するマクロで、一つ目の 4 2023/01/12 23:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
同一のユーザー、同一商品のと...
-
マイクラPC版のコマンドで効率...
-
テーブル名を省略して「h.id」...
-
副問合せの書き方について
-
複数テーブルのGROUP BY の使い...
-
select文のwhere句に配列を入れ...
-
SQLで残高計算
-
クエリ表示と、ADOで抽出したレ...
-
php+MySQLでレコードが何行目か...
-
select文で特定のIDを抽出しupdate
-
MySQLでのバイナリデータ削除方法
-
sqlで、600行あるテーブルを100...
-
SQL Left Join で重複を排除す...
-
書籍の内容はまともでしょうか?
-
MySQLのint型で001と表示する方...
-
【MySQL】本当に困っているので...
-
SQLサーバから、項目の属性(型...
-
SELECT/別テーブルのレコード...
-
AUTO_INCREMENTのあるテーブル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
副問合せの書き方について
-
SQLサーバから、項目の属性(型...
-
VIEWの元のテーブルのindexって...
-
select文のwhere句に配列を入れ...
-
selectした大量データをinsert...
-
センノシド異性体構造式
-
Unionした最後にGROUP BYを追加...
-
insertを高速化させたい
-
SQLにて特定の文字を除いた検索...
-
マイクラPC版のコマンドで効率...
-
ある条件の最大値+1を初番する...
-
inner joinをすると数がおかし...
-
sqlで、600行あるテーブルを100...
-
エクセルの関数について教えて...
-
Access パラメータクエリをcsv...
-
URL と行番号の指定
-
複数テーブルのGROUP BY の使い...
-
PL/SQLの変数について
おすすめ情報