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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

348閲覧

文字列として格納されてる日付の扱い方

Take_it

総合スコア357

MySQL

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/11/04 23:33

MySQL

1CREATE TABLE `test`.`test` ( `date` DATE NOT NULL , `ch` VARCHAR(255) NOT NULL , `code` INT UNSIGNED NOT NULL ) ENGINE = InnoDB; 2 3INSERT INTO `test` (`date`, `ch`, `code`) VALUES 4('2021-11-01', '2021-09-05,2021-09-15', '1'), 5('2021-11-02', '2020-10-05,2021-11-15', '3'), 6('2021-11-03', '2019-10-20,2021-12-15', '1'), 7('2021-11-04', '2020-10-03,2021-8-15', '3'), 8('2021-11-05', '2020-10-03', '1'), 9 ('2021-11-06', '2021-10-10', '3')

上記のようなテーブルがあった際に、カラムchにVARCHARとして格納されている日付で検索をかけ、(例えば2020-10-03)、
[1]2020-10-03のみの行
[2]2020-10-03を含む(他の日付もカンマ区切りで併記されている)行
それぞれ区別して取得したいのですが、WHERE句の書き方がイマイチよくわかりません。

MySQL

1SELECT * FROM `test` WHERE `code`='3' AND `ch` LIKE '2020-10-03'

現状はこれで2020-10-03をカラムchに含むレコードを抽出して、PHP側で判別をかけていますが・・・SQL側で上記条件をどうにかする方法ってありませんか?

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

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

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

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

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

guest

回答2

0

データ管理の仕方が悪いのでこの方式では効率的な検索は難しいです

カンマ区切りの文字列を検索するにはfind_in_set('2020-10-03',ch)
というやり方がありますが、これもあまりおすすめできません
カラムを分けるか、jsonなどで持つか検討ください

投稿2021/11/05 00:24

yambejp

総合スコア115102

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

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

0

ベストアンサー

のみ

`ch` = '2020-10-03'

ふくむ

`ch` like '%2020-10-03%'

ただ、なぜ1カラムに突っ込んでしまってるのか、用途などによって変わってくると思います。

投稿2021/11/05 00:03

m.ts10806

総合スコア80871

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

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

Take_it

2021/11/05 00:25

`ch` like '%2020-10-03%' とすると、 chがそれぞれ 2020-10-03 2020-10-03,2021-08-15 の行が出てきてしまいます。 2020-10-03を含み、かつ、他の日付も併記されているものだけを抽出する方法はないでしょうか・・・? >なぜ1カラムに突っ込んでしまってるのか 元の開発者が何も考えずにやったと思われます。。 日付なんだから日付型で扱うべきであって、最大でも2日付なので、 `ch1` DATE NOT NULL, `ch2` DATE DEFAULT NULL, とでもしといてくれれば良かったのですが・・・。 なお、影響範囲の予測がつかないためDB改変無しで対処する必要があります。
m.ts10806

2021/11/05 03:43

>chがそれぞれ あぁ、そのようには取れませんでした。下記のように一致を弾いてください。 `ch` <> '2020-10-03' and `ch` like '%2020-10-03%'
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問