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

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

新規登録して質問してみよう
ただいま回答率
85.48%
さくらのレンタルサーバ

さくらのレンタルサーバとは、格安サーバーで知られるさくらインターネット社の提供する共有レンタルサーバー。Webサイトの構築から簡単なプログラミングまで幅広く利用することができ、プランが多いことも特徴です。

MySQL

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

Q&A

解決済

1回答

515閲覧

MysqlでLEFT JOINしてWHERE句を使った場合にカラムの値の交換がうまくいかない

h-jimo

総合スコア9

さくらのレンタルサーバ

さくらのレンタルサーバとは、格安サーバーで知られるさくらインターネット社の提供する共有レンタルサーバー。Webサイトの構築から簡単なプログラミングまで幅広く利用することができ、プランが多いことも特徴です。

MySQL

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

1グッド

0クリップ

投稿2022/02/24 23:53

前提・実現したいこと

カラムの値を交換したい。

ordersのname3とname5の値をproductsのcustomer_id 103のものに限定して交換したい。

orders 「変更前の姿」

idproduct_idname1name2name3name4name5
1000011AAA111
1000022BBB222
1000032CCC333

orders 「値交換後の姿」

idproduct_idname1name2name3name4name5
1000011AAA111
1000022222BBB
1000032333CCC

products

idcustomer_idproduct_name
1101
2103
3103

現象

下記サイトを参考にSQLを作成し実行してみたもののLEFT JOINしてWHERE句を使うとうまくいかなかった。

MySQLで値の交換

mysql

1UPDATE tablename SET x=CONCAT(x, ':', y), y=SUBSTRING_INDEX(x, ':', 1), x=SUBSTRING_INDEX(x, ':', -1);

CONCAT(str1,str2,...)・・・文字列連結

SUBSTRING_INDEX(str,delim,count)・・・指定の区切り文字よりも前または後の文字列を取得

countが1の場合、左端から区切りまでの文字列取得

countが-1の場合、右端から区切りまでの文字列取得

上手くいかないSQL

LEFT JOINしてWHEREで絞り込んだ状態だとうまくいかない。
SQL文はエラーにならずに通るため構文エラーはない。

mysql

1UPDATE orders LEFT JOIN `products` on `orders`.`product_id` = `products`.`id` SET `name3`=CONCAT(name3, ':', name5), `name5`=SUBSTRING_INDEX(name3, ':', 1), `name3`=SUBSTRING_INDEX(name3, ':', -1) WHERE `products`.`customer_id` = 103; 2

SQL実行結果

idproduct_idname1name2name3name4name5
1000011AAA111
1000022BBBBBB
1000032CCCCCC
  • name3の値がname5に入るが、name3にname5の値が入らない。

試したこと

全レコードが対象になってしまうが、動作するSQL

mysql

1UPDATE orders SET name3=CONCAT(name3, ':', name5), name5=SUBSTRING_INDEX(name3, ':', 1), name3=SUBSTRING_INDEX(name3, ':', -1);

SQL実行結果

idproduct_idname1name2name3name4name5
1000011111AAA
1000022222BBB
1000032333CCC

LEFT JOIN のみでWHERE句を使わない場合、全レコードが対象になってしまうが動作する

mysql

1UPDATE orders LEFT JOIN `products` on `orders`.`product_id` = `products`.`id` SET `name3`=CONCAT(name3, ':', name5), `name5`=SUBSTRING_INDEX(name3, ':', 1), `name3`=SUBSTRING_INDEX(name3, ':', -1); 2

試しにLEFT JOIN せずWHERE句を使った場合動作する

mysql

1UPDATE orders LEFT JOIN `products` on `orders`.`product_id` = `products`.`id` SET `name3`=CONCAT(name3, ':', name5), `name5`=SUBSTRING_INDEX(name3, ':', 1), `name3`=SUBSTRING_INDEX(name3, ':', -1) WHERE `product_id` = 2; 2

確認用のSQL

mysql

1SELECT `orders`.`id`, `customer_id`,`name3`, `name5` FROM `orders` LEFT JOIN `products` on `orders`.`product_id` = `products`.`id` WHERE `products`.`customer_id` = 103; 2

何が間違っているのかご教授いただけないでしょうか。

よろしくお願いいたします。

補足情報

さくらインターネットレンタルサーバー
phpMyAdmin 4.9.5
Mysql 5.7

-- -- `orders` -- CREATE TABLE `orders` ( `id` bigint(20) UNSIGNED NOT NULL, `product_id` int(10) UNSIGNED DEFAULT NULL, `name2` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `name3` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `name4` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `name5` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT INTO `orders` (`id`, `product_id`, `name2`, `name3`, `name4`, `name5`) VALUES (100001, 1, '', 'AAA', '', '111'), (100002, 2, '', 'BBB', '', '222'), (100003, 2, '', 'CCC', '', '333'); -- -- `products` -- CREATE TABLE `products` ( `id` bigint(20) UNSIGNED NOT NULL, `customer_id` int(11) NOT NULL, `name1` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT INTO `products` (`id`, `customer_id`, `name1`) VALUES (1, 101, ''), (2, 103, ''), (3, 103, '');
退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

なぜLEFT JOINを利用しようと思ったのか疑問ですが
ordersのproduct_idとproductsのidで結合した時
productsのcustomer_idが103のレコードに対して
ordersのname3とname5を入れ替えるのであればこんな感じで

PHP

1update orders as t1,products as t2 set t1.name3=t1.name5,t1.name5=t1.name3 2where t1.product_id=t2.id and t2.customer_id=103

ただしレコードの入れ替えが効率的な運用方法だとは思えないのでよく考えたほうがいいですね

投稿2022/02/25 00:35

yambejp

総合スコア114839

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

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

h-jimo

2022/02/25 02:15

大変助かりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問