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

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に必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

解決済

2回答

2978閲覧

MySQLのSELECT文のWHEREのOR条件の繰り返し処理

DaisukeKusakari

総合スコア16

MySQL

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

SQL

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

PHP

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

0グッド

0クリップ

投稿2018/08/28 21:54

編集2018/08/29 10:35

いつもお世話になっております。

標題について、$dateには0~8個までの日付が格納されています(例:2018-08-29)。その格納されたデータ個数だけMySQLのSELECT文のWHEREのOR条件に追加する繰り返し処理をしたいのですが(FORループ?)、このような書き方はSQLで可能でしょうか。データ個数だけクエリを実行しておいいのですが、処理に時間がかかりそうな気がするし、あまり美しくないと感じました。

php

1function search_from_date($dbh, $date){ 2 if (!empty($date)){ 3 $cnt1 = count($date); 4 } 5 6 $active_days_str = get_active_days_str(); 7 $cnt2 = count($active_days_str); 8 if (empty($cnt1)||$cnt1 == $cnt2){ 9 $sql = <<<SQL 10 SELECT `id` 11 FROM `schedule` 12SQL; 13 $stmt = $dbh->prepare($sql); 14 if($stmt->execute()){ 15 $teacher_id = $stmt->fetchAll(); 16 return $teacher_id; 17 }else{ 18 return FALSE; 19 } 20 }else{ 21// $dateに日付が格納されていた時に$cnt1回数だけSQL WHERE文のOR条件を増やしたい…! 22 } 23}

仮想配列$dateから複数のカラム名を参照し、1が入ったidをOR検索したいです。
DB

spl

1CREATE TABLE `schedule` ( `id` varchar(20) NOT NULL, `2018-09-23` int(1) DEFAULT NULL, `2018-09-22` int(1) DEFAULT NULL, `2018-09-16` int(1) DEFAULT NULL, `2018-09-15` int(1) DEFAULT NULL, `2018-09-09` int(1) DEFAULT NULL, `2018-09-08` int(1) DEFAULT NULL, `2018-09-02` int(1) DEFAULT NULL, `2018-09-01` int(1) DEFAULT NULL ) 2INSERT INTO `schedule` (`id`, `2018-09-23`, `2018-09-22`, `2018-09-16`, `2018-09-15`, `2018-09-09`, `2018-09-08`, `2018-09-02`, `2018-09-01`) VALUES ('honda', NULL, 1, 1, 1, 1, 1, 1, 0)

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

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

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

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

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

yambejp

2018/08/29 10:26

画像で上げたデータをphpMyAdminのエクスポートでcreate table,insert into形式のテキストでサンプル提示してください
yambejp

2018/08/29 10:27 編集

かぶった
DaisukeKusakari

2018/08/29 10:37

カラム名を先生のIDにしてローを日付にすれば、よかったのでしょうか。
DaisukeKusakari

2018/08/29 10:38

運用としては、各先生がログインして直近1カ月分休日の予定を随時更新していくイメージです。
DaisukeKusakari

2018/08/29 10:40

一方で、生徒は先生を日付から検索して、予約できる(予定の空いている)先生を検索します
guest

回答2

0

MySPLってtypoでしょうか?

SELECT .... WHERE COL1 in(a, b, c, ...)

って書いたら良い案件かも?

投稿2018/08/28 22:06

Orlofsky

総合スコア16415

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

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

0

ベストアンサー

特定のカラムにいくつかのデータ候補をあてるのは一般的にこう

PHP

1$d=["2018-08-29","2018-12-31","2019-01-01"]; 2$data=[]; 3$sql ="SELECT `id` FROM `schedule` WHERE 1 "; 4if(count($d)>0){ 5 $sql.="AND `d` IN (".implode(",",array_fill(0,count($d),"?")).") "; 6 $data=array_merge($data,$d); 7} 8print $sql; 9print_R($data); 10 11/* 12$pdo = new PDO($dsn, $user,$password); 13$stmt = $pdo->prepare($sql); 14$stmt->execute($data); 15$rows=$stmt->fetchAll(PDO::FETCH_ASSOC); 16*/

sample

一応、ご提示のテーブルを利用してやるとこんな感じ

PHP

1$date=["2018-08-29", "2018-09-02","2018-09-08"]; 2 3$sql ="SELECT `id` FROM `schedule` WHERE 1 "; 4$cols=[ "2018-09-23", "2018-09-22", "2018-09-16", "2018-09-15", "2018-09-09", "2018-09-08", "2018-09-02", "2018-09-01"]; 5 6$sql.="AND ( 0 "; 7foreach($date as $d){ 8 if(in_array($d,$cols)!==false){ 9 $sql.="OR `{$d}`=1 "; 10 } 11} 12$sql.=") "; 13 14print $sql; 15
  • カラム名の一覧をホワイトストとして$colsに確保していて
  • 与えられた$dateの要素($d)が$colsに完全に合致すればカラム名として利用して

1と合致するかチェックする

  • OR検索なのでAND処理に対して(0 OR 条件1 OR 条件2 ・・・)というつなぎ方

投稿2018/08/29 00:27

編集2018/08/29 10:55
yambejp

総合スコア114833

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

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

DaisukeKusakari

2018/08/29 10:18

デバックしてみましたが、おそらく伝えたかった意図と異なります… 私の説明が悪くて申し訳ございません。 質問を修正しました。もう一度、ご検討いただければ幸いです。
DaisukeKusakari

2018/08/29 10:19

いくつかのカラムにデータ候補があります。それらのカラム名は$dateから取得します。
yambejp

2018/08/29 10:24 編集

なるほど、やりたいことはわかりましたが、 日付をカラムに使用するのは早晩破綻するやり方ですね このテーブル構成がマストなら 外部から持ち込んだ値を安全にカラム名に使うのは ホワイトリスト形式になるため 効率的な処理は難しいと思います。 テーブルの作り方を変える選択肢はないということでよろしいですか?
yambejp

2018/08/29 10:57

一応ご提示のサンプルを元にプログラムでSQL文を書く方法を 例示しておきました 与えられた$dateは汚染されている可能性が高いため 十分なチェックをしない限りカラム名として利用は できないことを理解ください なおprepareなどプレースホルダーを利用してもカラム名を 外部から持ち込むことはできません
DaisukeKusakari

2018/08/29 11:05

すいません、根本的なDBの構成から見直そうと思っていますが… カラム名を先生のIDにしてローを日付にすれば、運用上、先生が頻繁にカラム名を変更したり、検索したりすることもないので、汚染される可能性も少ない、安全という理解でよろしいでしょうか。
yambejp

2018/08/29 11:20 編集

データのもたせ方はこうしてください create table schedule2( `id` varchar(20) not null, `date` date, `reserve` int null, unique key (`id`,`date`) ); insert into schedule2 values ('honda','2018-09-23',null), ('honda','2018-09-22',1), ('honda','2018-09-16',1), ('honda','2018-09-15',1), ('honda','2018-09-09',1), ('honda','2018-09-08',1), ('honda','2018-09-02',1), ('honda','2018-09-01',0); ※場合によってはnullデータは投入しなくてもいい ただしnullと0は仕様上どういう違いがあるのでしょうか?
DaisukeKusakari

2018/08/29 11:28

同じです。未定(未入力)です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問