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

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

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

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

Q&A

解決済

2回答

371閲覧

SQLで各行の要素を基に一括UPDATEするスマートな方法を知りたいです。

maresuke

総合スコア16

MySQL

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

0グッド

0クリップ

投稿2019/09/04 13:49

編集2019/09/04 13:50

お世話になります。
sqlのコードを書いていて、ふと知りたいことが出てきました。
ご存じの方がいらっしゃいましたら、どうぞよろしくお願いいたします。

以下のようなテーブル「おやつ」があります。感想カラムはnullです。

果物感想
赤いりんご
赤いいちご
黄色いみかん

今、感想カラムに他のカラムからなる文字列を挿入するようUPDATEしたいと思います。
具体的には「感想」=”「日」に「色」「果物」を食べました。”となるような文字列を挿入したいと思います。
すなわちUPDATEした後のテーブルは

果物感想
赤いりんご1日に赤いりんごを食べました。
赤いいちご2日に赤いいちごを食べました。
黄色いみかん2日に黄色いみかんを食べました。

となるようにしたいのです。
私が考えた解決方法としては、PHPと連携して

php

12$sql="select * from 'おやつ'"; 3$result=$mysqli->query($sql); 4foreach($row = $result->fetch_assoc()){ 5 $str="{$row['日']}日にを食べました。"; 6 $update="update from 'おやつ' set '感想' = '{$str}' where '日' = '{$row['日']}'"; 7 $mysqli->execute($update); 8} 9

といった感じの処理を行う方法ですが、もっとスマートに(できればmysqlの機能のみで)単一のクエリで行うことはできないでしょうか。
個人的に調べましたが、調べ方が悪いのか目的とする情報を見つけ出すことができませんでした。
どなたかこれよりも美しい方法をご存じでしたら、どうかご教示ください。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

テーブルの内容で全て解決するので、php側でループなどは不要です。
ざっくりとした内容は以下です。※属性の変換やNull考慮などは適宜行って下さい。

SQL

1update おやつ set 感想 = concat(, '日に',, 果物, 'を食べました')

尤も、演算で求められる項目は保持しないという正規化の観点からは、そういった項目を保持する事は非推奨ですね。

投稿2019/09/04 14:55

編集2019/09/05 00:18
sazi

総合スコア25173

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

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

maresuke

2019/09/05 22:54

ありがとうございます! まさにこれが知りたかったのです
guest

0

2日に黄色いみかん

3行目のデータがなぜ2日なのか根拠がわかれば自動化可能です

Generated Column

以下のようにGenerated Column(生成列)を指定しておけば楽です。
生成列にはvirtualとstoredがあり、virtualなら容量もくわないので
viewのような感覚で列を利用できます

※注意:MySQL 5.7.6以降の機能

SQL

1create table tbl( 2d int, 3color varchar(10), 4fruit varchar(10), 5impression varchar(30) as (concat(d,'日に',color,fruit,'を食べました。')) ; 6 7insert into tbl(d,color,fruit) values 8(1,'赤い','りんご'), 9(2,'赤い','いちご'), 10(3,'黄色い','みかん'); 11 12select * from tbl;

投稿2019/09/05 00:27

編集2019/09/05 00:56
yambejp

総合スコア114779

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

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

maresuke

2019/09/05 22:56

なるほどです! Generated Columnは初耳ですが応用力が非常に高そうな機能ですね 今回の感想はfulltext検索のためのカラムなので、生成列についても深く調べてみようと思います! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問