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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

4回答

1732閲覧

sqlエラーについて

runban

総合スコア152

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2021/08/08 04:25

編集2021/08/08 08:03

分からない箇所
・登録しているデータベースから特定の情報を更新しようとした際、下記コードを実行すると、下記エラーが発生してしまいます。

update product_table join category_table on product_table.product_category_id = category_table.product_category_id set category_name = 'ソフト(旧作)’ where release_date < ’2020-1-1’;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '’ where release_date < ’2020-1-1’' at line 1

分からない箇所の詳細
・「発売日が2020年1月以前のカテゴリをソフトからソフト(旧作)に変更し、対象商品を1000円割引する」が今回求めている結果です。
情報を更新したいため「update」にて使用するテーブルを指定後、「set」「where」にて変更したい特定のカラムの情報を修正/定義しています。
また、2つのテーブルを結合してから結果を得たいため、「join」にて「product_table」と「category_table」を結合しています。


エラー内容に対して推測していること/試したこと
・syntaxエラーなので、'2020-1-1'の箇所で構文ミスしていると思うので、'2020-1-1 00:00:00'と時間まで記載してみたのですが、結果は同じでした。


テーブル情報

product_table↓

+---------------+---------------------+----------+-----------------------------------------+---------------+----------+--------------+---------------+---------------+ | product_id | product_category_id | genre_id | product_name | product_price | maker_id | release_date | target_age_id | product_stock | +---------------+---------------------+----------+-----------------------------------------+---------------+----------+--------------+---------------+---------------+ | 9966385271176 | 1 | 3 | ドラゴンクエスト11 | 4000 | 2 | 2018-12-11 | 1 | 9000 | | 7855635271176 | 1 | 2 | マリオカート8 | 4000 | 1 | 2018-07-23 | 1 | 13000 | | 8881635271176 | 1 | 1 | dead by daylight | 2000 | 3 | 2019-05-15 | 5 | 600 | | 7485859716476 | 2 | 6 | nintendo switch本体 | 30000 | 1 | 2017-01-25 | 1 | 30 | | 1452365885745 | 3 | 8 | レゴ (R)スーパーマリオ | 3000 | 1 | 2019-05-19 | 1 | 10 | | 1985665885745 | 1 | 5 | 桃太郎電鉄 | 8000 | 5 | 2020-12-30 | 1 | 9640000 | | 5252365885745 | 1 | 4 | ダービースタリオン. | 5000 | 4 | 2020-12-07 | 3 | 300 | | 9645365885745 | 2 | 7 | ゲームキューブコントローラ | 2000 | 1 | 2018-04-15 | 1 | 5000 | | 4452365885745 | 3 | 9 | どうぶつの森パーカー | 1000 | 1 | 2020-11-29 | 1 | 0 | | 3852365885745 | 1 | 10 | 大乱闘スマッシュブラザーズ | 10000 | 1 | 2017-08-06 | 2 | 76000 | +---------------+---------------------+----------+-----------------------------------------+---------------+----------+--------------+---------------+---------------+

category_table↓

+---------------------+-----------------------+ | product_category_id | category_name | +---------------------+-----------------------+ | 1 | ソフト | | 2 | 本体・周辺機器 | | 3 | グッズ | +---------------------+-----------------------+

「product_table」と「category_table」を結合して、「商品ID・商品名称・単価・発売日・カテゴリ名」を表示した結果です↓

+---------------+-----------------------------------------+---------------+--------------+-----------------------+ | product_id | product_name | product_price | release_date | category_name | +---------------+-----------------------------------------+---------------+--------------+-----------------------+ | 9966385271176 | ドラゴンクエスト11 | 4000 | 2018-12-11 | ソフト | | 7855635271176 | マリオカート8 | 4000 | 2018-07-23 | ソフト | | 8881635271176 | dead by daylight | 2000 | 2019-05-15 | ソフト | | 7485859716476 | nintendo switch本体 | 30000 | 2017-01-25 | 本体・周辺機器 | | 1452365885745 | レゴ (R)スーパーマリオ | 3000 | 2019-05-19 | グッズ | | 1985665885745 | 桃太郎電鉄 | 8000 | 2020-12-30 | ソフト | | 5252365885745 | ダービースタリオン | 5000 | 2020-12-07 | ソフト | | 9645365885745 | ゲームキューブコントローラ | 2000 | 2018-04-15 | 本体・周辺機器 | | 4452365885745 | どうぶつの森パーカー | 1000 | 2020-11-29 | グッズ | | 3852365885745 | 大乱闘スマッシュブラザーズ | 10000 | 2017-08-06 | ソフト |

もし足りない情報があれば、コメント欄にて補足情報をお送りさせていただきます。
解決方法をご教示いただけませんでしょうか。よろしくお願いいたします。

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

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

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

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

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

sazi

2021/08/08 07:26

エラーは解決したようですが、上手く行かない更新を解決したいなら、テーブルの定義およびサンプルデータを質問に追記して下さい。
m.ts10806

2021/08/08 07:28

テーブル定義をCREATE TABLE文で、サンプルデータをINSERT文で提示してください。 あと「エラーを解消する」と「想定通りに実行する」は別問題なので、「エラーを解決することだけ」が目的でないのでしたら、やはり定義を提示されないと解決には向かわないと思います。
runban

2021/08/08 08:02 編集

ご指摘頂きありがとうございます。 ただいまテーブル情報を追加させていただきましたので、ご確認頂けますと幸いです!
m.ts10806

2021/08/08 08:05

タイトルも調整しておいてくださいね。 タイトルだけ見るとエラーの解消だけが目的になりますので。
guest

回答4

0

引用符が正しくないように見えます。ASCIIの'を使ってみたらどうなりますでしょうか?

投稿2021/08/08 04:29

maisumakun

総合スコア145184

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

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

runban

2021/08/08 05:55

コメント頂きありがとうございます! maisumakunさんのご指摘通り、ASCIIの'を使用すると、エラーが発生することなく実行することができました! ただ、category_tableが持つcategory_nameの全てが「ソフト(旧作)」と上書きされてしまう結果になってしまいました、 追加の質問で大変恐縮なのですが、2020年1月以前のデータのみ更新したい場合、どのようにコードを修正すればベストか分かりますでしょうか?
guest

0

「発売日が2020年1月以前のカテゴリをソフトからソフト(旧作)に変更し、対象商品を1000円割引する」

求める結果はデータから判断できますのでselectで編集を行えば良いだけです。
データを書き換えるのは極力避けた方が良いですね。

SQL

1select product_id, product_name 2 , release_date 3 , category_name 4 , product_price - (1000 * (release_date < '2020-01-01')) as product_price 5 , conact(category_name , case when release_date < '2020-01-01' then '(旧作)' else '' end) as category_name 6from product_table as product 7 inner join category_table as category 8 on product.product_category_id=category.product_category_id

投稿2021/08/08 10:26

編集2021/08/08 11:32
sazi

総合スコア25195

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

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

0

SQLでは文字列はシングルクォートで囲みます。シングルクォートは半角文字を使ってください。また、文字列中のシングルクォートは2つ続けて記述します。

SQL

1set category_name = ‘ソフト(旧作) where release_date <2020-1-1;23set category_name = 'ソフト(旧作) where release_date < ''2020-1-1'';'

投稿2021/08/08 07:19

Orlofsky

総合スコア16415

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

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

0

ベストアンサー

補足のテーブル構造を見ました。以下のようにすると良さそうです。

  1. まず、category_tableに「ソフト(旧作)」というレコードを追加してください(product_category_idは4になったとします)。
  2. その後以下のSQLで、2020年以前に発売されたproductのproduct_category_idを4にします。

sql

1UPDATE `product_table` SET product_category_id = 4 WHERE release_date < '2020-1-1';

投稿2021/08/08 04:51

編集2021/08/08 08:49
Masa-Shin

総合スコア269

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

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

runban

2021/08/08 05:45

コメント頂きありがとうございます! Masa-Shinさんのコードを実行してみたところ、エラーが発生することなくコードを通すことができました! ただ、category_tableが持つcategory_nameの全てが「ソフト(旧作)」と上書きされてしまう結果になってしまいました、 追加の質問で大変恐縮なのですが、2020年1月以前のデータのみ更新したい場合、どのようにコードを修正すればベストか分かりますでしょうか?
Masa-Shin

2021/08/08 06:07

すみません、日付の引用符が抜けていたため回答を修正しました。こちらでいかがでしょうか?
runban

2021/08/08 06:31 編集

修正頂きありがとうございます! ただ実行してみたのですが、同じくcategory_tableが持つcategory_nameの全てが書き換えられてしまう結果になってしまいました、 実行後にwhere文以降が正しく認識されていないため、category_name全てが書き換えられてしまう形になってしまうのか、、と考えてみたのですが、その場合だと実行自体されないですもんね、
Masa-Shin

2021/08/08 09:58 編集

追記を見ました。product_tableにはcategory_nameがないため、元々のの書き方でproduct_tableの更新はできません。 まずはcategory_tableに「旧作」というレコードを追加し、その後product_category_idを更新する形が良いかと思います。
runban

2021/08/09 05:51

なるほどですね、、 ご教示いただいた通り、旧作のレコードを追加して進めていきたいと思います! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問