質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

873閲覧

MySQLで、あるカラムの値に応じて別のカラムの値を決定したい

qwe001

総合スコア133

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2020/09/15 03:50

プレゼント応募フォームを作成中です。

テーブル定義は次の通りです

CREATE TABLE IF NOT EXISTS `vote_results` ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(255) NOT NULL, product_code int(11) NOT NULL, product_name varchar(255) NOT NULL, created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

フォームに名前を記入し、応募したい商品を選択すれば、
名前、商品コード、商品名がDBにINSERTされるという仕様です。

事情があり、商品データをマスタテーブルで管理することはできません。
名前も同様です。なので、JOINするという選択肢が使えません。

さて、この状態でテストデータを10万件ぐらい作る必要があります。

暫定的に次のようなものを作りました

TRUNCATE vote_results; INSERT INTO vote_results () VALUES (); INSERT INTO vote_results (id) SELECT 0 FROM vote_results; -- 2倍ずつ増えていくので10万件ぐらいになるまで繰り返す UPDATE vote_results SET name = CONCAT('山田太郎_', CEIL(RAND() * 100)), product_code = ELT(0.5 + RAND() * 2, 'product_a','product_b'), product_name = ELT(0.5 + RAND() * 2, '商品名A','商品名B'), created_at = ADDTIME(CONCAT_WS(' ','2020-09-01' + INTERVAL RAND() * 31 DAY, '00:00:00'), SEC_TO_TIME(FLOOR(0 + (RAND() * 86401)))) ;

したいことは、商品コードがproduct_aならば、商品名を商品名Aに、商品コードがproduct_bならば、商品名を商品名BにUPDATEすることです。

こうすれば出来ると思いますが

UPDATE vote_results SET product_name = '商品名A' WHERE product_code = 'product_a'; UPDATE vote_results SET product_name = '商品名B' WHERE product_code = 'product_b';

実際には商品データが50件程あるため、50行分のUPDATE句を作るのはできなくはないですがしんどいです。

なにか、ワンライナーで実現する方法はありませんか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

事情があり、商品データをマスタテーブルで管理することはできません。
名前も同様です。なので、JOINするという選択肢が使えません。

マスターを仮に作れば良いんじゃないでしょうか。
残しちゃまずいなら、一時テーブルで作って、終わったらdropするとか。
また、テーブル化しないで、インラインビューにする方法でもいいでしょうし。

50行分のUPDATE句を作るのはできなくはないですがしんどいです。
なにか、ワンライナーで実現する方法はありませんか?

SQLの記述を簡単にするなら、その分何処か(例えばデータ)で手間が掛かるという事ですけどね。

投稿2020/09/15 05:05

編集2020/09/15 05:38
sazi

総合スコア25206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ちょっと何をやりたいかわかりづらいですが
大量のダミーデータをつくるだけならprocedureでやればよいでしょう

投稿2020/09/15 03:55

yambejp

総合スコア115034

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問