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

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

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

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

Q&A

解決済

4回答

4677閲覧

MYSQLで複数パターンの条件がある場合の、selectの方法

SugiuraY

総合スコア317

MySQL

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

0グッド

0クリップ

投稿2017/10/13 09:01

編集2017/10/13 09:02

いつもお世話になります。
下記のように、A社及びB社を軸に複数の条件に応じてselectして
該当する値をDBから取得したい(該当があるとは限らない)のですが、
自分の知識では、提示のコードのようにfor文でループさせるしか思いつきません。
もちろん、このようにするとクエリを何度も発行するので非常に重い処理になってしまいます。
何か良い方法はございますでしょうか?

PHP

1$array_1=array(array("A社",100),array("A社",200),array("B社",300)); 2$array_2=array("aaaa","bbbb"); 3 4for ($i=0; $i <count($array_1); $i++) { 5 for ($j=0; $j <count($array_2); $j++) { 6 7try { 8//一部省略 9$sql=$pdo->query("SELECT B FROM testDB where C=:one AND D=:two AND E=:three"); 10$stmt=$pdo->prepare($sql); 11$stmt->bindValue(':one',$array_1[$i][0] , PDO::PARAM_STR); 12$stmt->bindValue(':two',$array_1[$i][1] , PDO::PARAM_STR); 13$stmt->bindValue(':three',$array_2[$i], PDO::PARAM_STR); 14$stmt->execute(); 15$result=$stmt->fetchall(PDO::FETCH_NUM); 16} catch (Exception $e) { 17var_dump($e->getMessage()); 18} 19 20 21 } 22} 23 24//期待するresult 25//1) A社/100/aaaaの組み合わせ→1000 26//2) A社/200/bbbbの組み合わせ→3000 27//3) B社/300/bbbbの組み合わせ→4000 28 29 30>>testDB 31[A] [B] [C] [D][ E] 321,1000,A,100,aaaa 332,2000,A,200,zzzz 343,3000,A,200,bbbb 354,4000,B,300,bbbb 365,5000,B,300,zzzz 376,4000,B,100,yyyy 387,3000,C,500,kkkk 398,2000,C,300,aaaa 409,1000,C400,dddd 41 42

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

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

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

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

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

guest

回答4

0

たとえばこう

$a1=[["A社",100],["A社",200],["B社",300]]; $a2=["aaaa","bbbb"]; $a3=[]; $sql="select * from tbl where 1 \n"; $sql.="AND ( 0 \nOR "; $sql.=implode ("OR ",array_fill(0,count($a1)*count($a2),"C=? AND d=? AND E=? \n")); $sql.=") " ; print $sql; $a3=[]; foreach($a1 as $ax){ foreach($a2 as $val){ $a3=array_merge($a3,$ax); array_push($a3,$val); } } print_r($a3); /* $stmt=$pdo->prepare($sql); $stmt->execute($a3); */

投稿2017/10/13 09:50

yambejp

総合スコア114572

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

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

SugiuraY

2017/10/13 17:05

yambejp様 いつもコメントありがとうございます。 何点か使い方がわからないものについて、調べてみました。 1) where 1 は無条件で全データを返しのちの条件を書きやすくすることができるのですね。初めて知りました。ありがとうございます。 2) 一方2点調べてもわからなかったのですが、”0 OR”の0が意味するところと”\n”で改行を入れている点です。何か参考になるサイトだけでもとても嬉しいです。 よろしくお願い申し上げます。
guest

0

ベストアンサー

PHPは詳しくないのですが、SQLでは以下のような問い合わせが可能です。

SQL

1SELECT B FROM testDB 2where (C, D, E) In ( 3 ('A社',100,'aaaa'),('A社',200,'bbbb'),('B社',300,'bbbb') -- この部分を動的に生成 4 )

同じループで回すにしても、上記の配列部分を動的に生成すれば、SQLの発行も1度で済みます。

投稿2017/10/13 09:25

sazi

総合スコア25138

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

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

SugiuraY

2017/10/13 09:44

コメント有難うございます。 where inを初めて知りました! 早速使ってみます!
SugiuraY

2017/10/13 09:44

コメント有難うございます。 where inを初めて知りました。 早速使ってみます!
guest

0

単純にSQLでだけ考えると、

SQL

1SELECT B FROM testDB where 2( 3 (C='A社' AND D=100 AND E='aaaa') OR 4 (C='B社' AND D=200 AND E='bbbb') OR 5 (C='B社' AND D=300 AND E='bbbb') 6)

という形になります。
なので、上のような SQL を動的に作成してみましょう。

PHP

1$wheres = array(); 2foreach($array1 as $company) { 3 foreach($array2 as $code) { 4 $wheres[] = sprintf("C='%s' AND D=%s AND E='%s')", $company[0], $company[1], $code); 5 } 6} 7$sql = "SELECT B FROM testDB WHERE (" . implode(" OR ", $wheres) . ")"; 8...

でどうでしょうか。

投稿2017/10/13 09:37

tacsheaven

総合スコア13703

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

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

SugiuraY

2017/10/13 09:41

有難うございます。 大変参考になりました!
guest

0

ちょっと雑に書きましたが、"aaaa"と"bbbb"を抽出してからループしても良いかもしれません。

PHP

1<?php 2ini_set('display_errors', true); 3error_reporting(E_ALL); 4 5$dsn = 'mysql:host=localhost;dbname=test;charset=utf8;'; 6$username = 'test'; 7$password = 'test'; 8$options = [ 9 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 10 , PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC 11]; 12$oPdo = new PDO($dsn, $username, $password, $options); 13$array_1=array(array("A社","100"),array("A社","200"),array("B社","300")); 14$array_2=array("aaaa","bbbb"); 15$inClause = substr(str_repeat(',?', count($array_2)), 1); 16$sql = "SELECT B,C,D FROM testDB where E in (%s)"; 17$stmt = $oPdo->prepare(sprintf($sql, $inClause)); 18$stmt->execute($array_2); 19$result=$stmt->fetchall(PDO::FETCH_NUM); 20foreach ($result as $value) { 21 foreach ($array_1 as $searchVal) { 22 if($value[1] === $searchVal[0] and $value[2] === $searchVal[1]){ 23 echo $value[0].$value[1].$value[2].nl2br("\n"); 24 } 25 } 26} 27?> 28

投稿2017/10/13 09:29

motuo

総合スコア3027

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

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

SugiuraY

2017/10/13 09:43

コメント有難うございます。ちょっとphp的にわからない部分もあったので勉強してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問