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

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

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

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

PHP

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

Q&A

解決済

4回答

1994閲覧

特定の条件時に、一部のwhere句を無効にしたい

chibi144

総合スコア64

SQL

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

PHP

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

0グッド

1クリップ

投稿2017/12/28 09:00

###前提・実現したいこと
PHP+MySQLでDBを操作しています。
表示名(例:「夏の野菜(葉物)」)を分解した後にSQLに埋め込んでいるのですが、
一部だけwhere文を省略したい部分があります(例:「夏の果物」)。

ISNULLなどを試してみましたが、
「夏の果物」は表示できても、「夏の野菜(葉物)」が表示できなくなったりしました。
$type_arrの要素数を数えて、if文で分岐させるしかないのでしょうか。

###該当のソースコード

php

1 public function getList($type, $maker) 2 { 3 $type = $this->typeEdit($type); 4 5 //$typeを分解する 6 $type_arr = explode('・', $type); 7 array_push($type_arr, $maker); 8 9 $sql = 'SELECT * FROM data 10 where data.item_type_1 =? 11 and data.item_type_2 =? 12 and data.item_type_3 =? //←これを無効にしたいです 13 and data.item_maker_id =?'; 14 $stmt = $this->pdo->prepare($sql); 15 $stmt->execute($type_arr); 16 $this->rows = $stmt->fetchAll(); 17 $this->listEdit(); 18 return $this->rows; 19 } 20 21 protected function typeEdit($type) 22 { 23 switch($type){ 24 case '夏の野菜(葉物)': 25 $type = '野菜・夏・葉物'; 26 break; 27 case '夏の野菜(根物)': 28 $type = '野菜・夏・根物'; 29 break; 30 case '冬の野菜(葉物)': 31 $type = '野菜・冬・葉物'; 32 break; 33 case '冬の野菜(根物)': 34 $type = '野菜・冬・根物'; 35 break; 36 case '夏の果物': 37 $type = '果物・夏'; 38 break; 39 case '冬の果物': 40 $type = '果物・冬'; 41 break; 42 default:; 43 } 44 return $type; 45 }

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

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

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

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

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

guest

回答4

0

こんな感じですかね?

PHP

1 2$sql ='SELECT * FROM data WHERE 1 '; 3if(count($type_arr)>1) $sql.='AND item_type_1 =? '; 4if(count($type_arr)>2) $sql.='AND item_type_2 =? '; 5if(count($type_arr)>3) $sql.='AND item_type_3 =? '; 6$sql.='AND item_maker_id =? ';

キーワードを文字列におきかえて分解するのは無駄では?
置き換えの際に配列にすればすこし効率がよくなると思います

投稿2017/12/28 09:09

yambejp

総合スコア114812

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

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

chibi144

2018/01/19 01:10

ご回答ありがとうございました。ご指摘の通りです。最初から配列にすることにしました。
guest

0

SQL動的に変える方が良いと思いますが・・・coalesceでやってみました。

php

1public function getList($type, $maker) 2 { 3 $type = $this->typeEdit($type); 4 5 //$typeを分解する 6 $type_arr = explode('・', $type); 7 if (count($type_arr)==2) array_push($type_arr, NULL); 8 array_push($type_arr, $maker); 9 10 $sql = 'SELECT * FROM data 11 where data.item_type_1 =? 12 and data.item_type_2 =? 13 and data.item_type_3 =coalesce(?,data.item_type_3) 14 and data.item_maker_id =?'; 15 $stmt = $this->pdo->prepare($sql); 16 $stmt->execute($type_arr); 17 $this->rows = $stmt->fetchAll(); 18 $this->listEdit(); 19 return $this->rows; 20 } 21 22 protected function typeEdit($type) 23 { 24 switch($type){ 25 case '夏の野菜(葉物)': 26 $type = '野菜・夏・葉物'; 27 break; 28 case '夏の野菜(根物)': 29 $type = '野菜・夏・根物'; 30 break; 31 case '冬の野菜(葉物)': 32 $type = '野菜・冬・葉物'; 33 break; 34 case '冬の野菜(根物)': 35 $type = '野菜・冬・根物'; 36 break; 37 case '夏の果物': 38 $type = '果物・夏'; 39 break; 40 case '冬の果物': 41 $type = '果物・冬'; 42 break; 43 default:; 44 } 45 return $type; 46 }

投稿2017/12/28 16:25

A.Ichi

総合スコア4070

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

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

chibi144

2018/01/19 01:16

ご回答ありがとうございます。 coalesce、今まで知りませんでした。 null(根物・葉物がないときの初期値)をdata.item_type_3にひっくり返すイメージなんですね。
guest

0

ifnullやcaseなどで特定条件下で値そのもの(data.item_type_3)を返せば
全件一致(無効化)できませんか?

SQL

1SELECT * FROM data 2where data.item_type_3=ifnull(?,data.item_type_3)

こんな感じなら?がnullのときにdata.item_type_3=data.item_type_3になるので
実質無効化できそうですが。

投稿2017/12/28 15:38

sousuke

総合スコア3828

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

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

chibi144

2018/01/19 01:11

ご回答ありがとうございます。 今回は他の方法で解決したのでifnullは使わなかったのですが、 無効化自体は今後も使いそうなので、覚えておきます!
guest

0

ベストアンサー

自分好みに

php

1$sql = 'SELECT * FROM data WHERE 1 '; 2foreach($type_arr as $i=>$type){ 3 $sql.=' AND data.item_type_'.($i+1).' = ?'; 4} 5$sql.=' AND data.item_maker_id =?';

同じ文字列を3回以上書いてはならない掟

php

1function parseTypeStr($type){ 2 preg_match('/^([春夏秋冬])の(.+?)(((.+)))?$/',$type,$matches); 3 $rtn=[$matches[2],$matches[1]]; 4 if($matches[4])$rtn[]=$matches[4]; 5 return $rtn; 6}

どうせ秋冬が増えたりするんでしょ、知ってるんだから///

投稿2017/12/28 10:32

KazuhiroHatano

総合スコア7804

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

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

chibi144

2018/01/19 01:09

ご回答ありがとうございました。ベストアンサーをつけるのを忘れていました、すみません。 << 同じ文字列を3回以上書いてはならない掟 よくやらかしてますので、肝に命じます。 なお、秋冬は増えませんでした///
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問