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

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

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

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

Q&A

解決済

4回答

3724閲覧

phpMyAdmin(MYSQL)でCASE構文の使い方が良く分かりません。

Guamstreet

総合スコア31

MySQL

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

0グッド

0クリップ

投稿2016/07/24 00:53

編集2016/07/24 03:26

(編集・追記依頼のご指摘を受け、全体的に、内容修正実施しました。すいませんが、改めてよろしくお願い致します)

よろしくお願いします。

CASE構文について、この構文は下記の使い方は適切でしょうか?それとも、もっと別の構文に効率的で利便性の良い構文がありますか?それを教えて頂きたいです。

まず、最初に、あるデータベースの(customer_table)というテーブル内容を、phpMyAdmin(MYSQL)にて管理している場合、以下の実現させたい内容については、CASE構文を使うのは、使う構文として適切ですか?

【 実現させたいこと 】
日付が入力されてない鈴木、橋本の『state』カラムを『未訪問』と更新させ、最終的に以下のデータベースの内容となるようにしたい。

【 実現前 】
(customer_table)
id(INT) customer(text) visiting_date(date) state(text)
1 田中 2016/07/23 訪問済み
2 鈴木
3 山田 2016/07/22 訪問済み
4 橋本

↓ ↓ ↓ ↓ ↓

【 実現後 】
(customer_table)
id(INT) customer(text) visiting_date(date) state(text)
1 田中 2016/07/23 訪問済み
2 鈴木 未訪問
3 山田 2016/07/22 訪問済み
4 橋本 未訪問

上記実現させるべく、以下の内容のSQL(CASE構文)を作成し、実行しました。しかし、エラーになりました。

SELECT
id,customer,visiting_date,state,
(CASE visiting_date
WHEN '' THEN '未訪問'
END) AS state
FROM
customer_table

【 エラー構文は以下の通り 】
#1064 - 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 ○○○(何か、文字化けしたような文字です) '' THEN 'ç„¡ã

これは、私の構文作成の内容が間違っているのでしょうか?
エラーの内容を、自分なりに訳しました。

『SQLのシンタックスが間違っています。あなたのMYSQLサーバーのバージョンが一致しているのを確認してください。』

みたいな感じかなと思いました。
(すいません、英語が得意でないので、正しく訳されてないかもしれません)

総じて、何が原因で正常に実行できないのか、自分の実現したいことが叶わないのか、分かりません。

具体的に、

①この時に使う適切な構文として、CASE構文は適切なものですか?それとも、他に、適切な構文がありますか?適切な構文がありましたら、その構文と、具体的な構文の内容を教えて下さい。

②仮に、今回の実現させたい内容についての構文として、CASE構文が適切な構文だとしたら、その構文はどの様になりますか?その構文を具体的に教えて下さい。

③また、仮に、CASE構文が、今回使う適切な構文でないとしても、例えば、このようにすれば、CASE構文も利用可能だよ、と言うのがあれば、是非、そのCASE構文も、具体的に教えて下さい。

④それから、基本的な事ですが、CASE構文というのは、phpMyAdminのバージョンによって使えないとかあるのですか?現在使用しているphpMyAdminのバージョンは、4.0.8です。(ちなみにFUTOKAサーバーを利用していて、サーバー内に標準装備されているphpMyAdminを使用して、今回の実現したい事をやっています)

以上、①~④について、具体的な構文を、ご教示下さいますように、どうぞ、お力添えの程、よろしくお願い申し上げます。

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

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

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

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

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

flied_onion

2016/07/24 01:09

推奨していない質問 https://teratail.com/help/avoid-asking > コードをください・デバッグしてください等の丸投げの質問 > まずは実際に作業に取り組み、つまづいたところで投稿をしてみてください。 とありますので、まずは何かを参考に自分で書いてみてください。 (既に試してみてエラーか何かでうまくいかないならそれを示してください) あと「自動検知」「自動入力させたい」という表現がすこし引っかかったのですが、 visiting_dateが空なら '未訪問' という文字列にデータベースのデータを更新したい(変更したい)という事ですか? visiting_dateの型はなんでしょうか。
Guamstreet

2016/07/24 03:53

ご指摘頂いた通り、修正・追加を掛けましたので、引き続き、どうぞよろしくお願い致します。
flied_onion

2016/07/24 04:24

回答で提示されているSQLが実行できているのなら、実行はできそうな気がしますね。ためしに1行にしてみても同じエラーですか? あと条件を増やしたいならWhere句に追加します。
Guamstreet

2016/07/24 04:39

返信ありがとうございました。すいません、初心者なので、仰られている意味が分かりません。『ためしに1行にしてみても・・・』と言う『1行』とは、何を指しているのですか?
guest

回答4

0

[回答ではありません]
すでに解決済ですし、細かいことですが、少し気になったので完全に蛇足ですがコメントしておきます。
MySQLの公式日本語訳では「CASE構文」と「CASE式/CASE演算子」を別物として扱います。
今回の質問文で使われているのは「CASE構文」ではなく「CASE式(またはCASE演算子)」です。

[参考] MySQL 5.6 リファレンスマニュアル 13.6.5.1 CASE構文
[参考] MySQL 5.6 リファレンスマニュアル 12.4 制御フロー関数

(問題ない限りこの回答へのコメントは不要です。)

投稿2016/07/25 05:04

dupont_kedama

総合スコア925

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

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

0

3点調整が必要

  • visiting_dateは値がないときにnullなのか0000-00-00なのかはっきりする

本来はNULLは利用しないほうが効率的

  • customerは検索項目にしたいならtextではなくvarcharなどにする

また完全一致なのか部分一致なのかも仕様をきめる必要がある

  • 更新したい箇所はstateで間違いないか確認する

通常はテキスト形式ではなくintでデータをもち、正規化しておく

かりにvisiting_dateの空をnullだとして

SQL

1update テーブル名 set state='未訪問' where 1 2AND (0 3OR visiting_date is null 4OR visiting_date <= CURDATE() - INTERVAL 1 MONTH) 5AND customer='田中';

投稿2016/07/25 03:57

yambejp

総合スコア114759

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

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

Guamstreet

2016/07/26 04:39

yambejpさん ご回答、ありがとうございました。 上記については、今後の助けとして行きたいと思います。
guest

0

takasima20さんがベストアンサー出してますが、
あえてCASE式で上記要件を満たす場合は以下のような感じですかね。

SQL

1UPDATE テーブル名 2SET 3 state = 4 (CASE 5 WHEN COALESCE(visiting_date, '') = '' THEN '未訪問' 6 WHEN visiting_date <= DATE_ADD(CURRENT_DATE, INTERVAL - 1 MONTH) AND customer = '田中' THEN '未訪問' 7 ELSE '訪問済み' 8 END 9 )

WHERE条件指定をしていないので、
全レコードが洗い替え対象になってしまいますが…^^;

###追記
コメントを受け追記しときます。

  • COALESCEについて

こちらはご存知でしたら読み飛ばしてください。

COALESCEとは標準SQLで定義されている関数(なのでMySQL、SQL Server、Oracleでも利用可)で、
機能としては引数リストの内左から最初にNULLでなかった値を返します。

そのためサンプルで掲示した、

SQL

1COALESCE(visiting_date, '')

というのはvisiting_dateがNULLでないならvisiting_dateの値を、
visiting_dateがNULLなら''を返します。

  • 利用意図について

当方がMySQLの仕様について熟知してないのでもしかしたら意味ないかもですが、
visiting_dateのNULLと''が異なる値と解釈される場合、

SQL

1visiting_date = ''

ではisiting_dateがNULLの場合に更新対象外とされるため、
COALESCEをかませてNULL → ''に変換することでNULLと''をまとめて評価できるようにしています。

つまるところtakasima20さんの最初に掲示されたSQLの

SQL

1visiting_date is null or visiting_date = ''

上記条件と振る舞いは同様となります。

投稿2016/07/24 06:08

編集2016/07/25 14:20
Panzer_vor

総合スコア1636

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

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

Guamstreet

2016/07/25 04:27

KotoriMaturiさんへ 有益なアドバイス、どうもありがとうございました。 ご提案頂いた内容どおりに実行しました所、私の実現させたい事が実現致しました。 複数条件を指定する場合は、こちらの方が構文もすっきり分かり易くて、大変によろしいと思いました。 ただ、一つだけ、ご提案頂いた構文の中で、 COALESCE(visiting_date, '') とあります。 COALESCE文で括るのは、なぜでしょうか? この部分の意味が良く分かりませんです。 もしよろしかったら、ご教示願えませんでしょうか? いずれにしても、自分でやってみて、複数条件の場合は、こちらのほうが、使いやすく、かつ分かり易いと思われましたので、今後、こちらの構文を使わせて頂こうと思います。 非常に助かりました。 ほんとにありがとうございました。 あと、もう少し、お付き合い願えるのでしたら、是非、先程の、 COALESCE(visiting_date, '')の理由を、お聞かせくださいませ。
Guamstreet

2016/07/26 04:38

KotoriMaturiさん 追記の方、よく分かりました。 どうもありがとうございました。 今後の助けとしていきたいと思います。 ここまで、お付き合いして下さり、ほんとに、どうもありがとうございました。 ほんとに助かりました。 それでは、私の、全ての質問について、終了させて頂きたいと思います。
guest

0

ベストアンサー

SQL

1update テーブル名 set visiting_date='未訪問' where visiting_date is null or visiting_date=''

じゃだめスかね。
--- 追加 ---

「一か月以上更新が無い」という条件ならこんな感じでいけると思います。

SQL

1not date_add(visiting_date, interval 1 month) > now()

投稿2016/07/24 01:06

編集2016/07/24 06:19
takasima20

総合スコア7458

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

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

Guamstreet

2016/07/24 03:52

takasima20さん 早速のご回答、どうもありがとうございました。 早速、教えて頂いた通り実行したところ、私の実現したいことが、あっさりと実現しました。 ほんとに、どうもありがとうございました。 それで、ついでと言ってはなんですが、今回の実現したい事を実現させた事で、新たに実現させたい事が発生しました。 それは何かと言うと、 例えば、【 1ヶ月以上、訪問せず、更に、田中という性に限って、未訪問としたい 】という、要するに複数以上条件が一致するお客に対してのみ、『state』カラムに『未訪問』と、更新したい時は、どのような構文になるか?その構文を教えて頂きたいです。 大変申し訳ありませんが、これについても、是非、ご教示頂ければ幸いでございます。
Guamstreet

2016/07/25 04:31

takasima20さんへ 完璧です! 私の実現したいことが、これで100%実現できました。 ほんとにたすかりました!ありがとうございました! KotoriMaturiさんと、ベストアンサーに迷いましたが、 いち早く、有益な情報で、私の手助けをしてくださいましたtakasima20さんの方をベストアンサーとさせていただきます。 ほんとにどうもありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問