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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

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

Q&A

解決済

3回答

2081閲覧

複数項目の検索がしたい。非常に困っています

samazama4623

総合スコア59

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

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

0グッド

0クリップ

投稿2015/05/30 17:24

複数検索項目があり、部分一致検索の項目と完全一致検索の項目が混じっている検索フォームを作っています。
例として、検索項目が
ID(完全一致) テーブル名:t1
姓(部分一致) テーブル名:t1
名(部分一致)テーブル名:t1
コード(完全一致)←IDと紐付けて別テーブルからleft joinしてきて取得テーブル名:t2
の項目があるとします。
まず
$sql = " select t1.id,t1.mei,t1.sei,t2.code from t1 ";
として
where句を足していくと思うのですが
どのように動的に書いてよいかわかりません。
例えば
$search_param =array();
$search_param[] = id;
$search_param[] = mei;
$search_param[] = sei;
$search_param[] = code;
$count =0;
foreach($search_param as $val){
if($count ==0){
$sql .= "where."t1.". $val."=?";
}else{
$sql .= " AND."t1.".val."=?";
}
$count++;
}
で基本的な動的sqlは作れるのですが
IDは、完全一致、姓名は部分一致、コードは完全一致のためこの先どうやってsqlを組み立てればよいか悩んでいます。
また、上記のコードですと、
検索項目のコードがPOSTされた時、
where句が
t1.code = t1.code;
となってしまいエラーが出てしまいます。
ここをt1.code = t2.code;としたいのですが、
いまいちわかりません。
上記の二つを解決するには、どうしたらよいですか
非常に困っています。ご教授お願い致します

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

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

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

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

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

guest

回答3

0

ベストアンサー

根本的な事なのですが、SQL文が間違っていませんか?

select
t1.id,
t1.mei,
t1.sei,
t2.code
from
t1
left join t2 on (t1.code = t2.code)
where
1=1
and
・・・・・・;

的なSQL文になるのではないでしょうか?

$sql = "select t1.id,t1.mei,t1.sei,t2.code "
. "from t1 left join t2 on (t1.code = t2.code) "
. "where 1=1 ";

$search_param = array();
$param = array();
$search_param['t1.id'] = $id;
$search_param['t1.mei'] = $mei;
$search_param['t1.sei'] = $sei;
$search_param['t2.code'] = $code;
foreach($search_param as $key => $val){
if($key == 't1.id'){
$sql .= "and t1.id = ? ";
$param[] = $val;
}else if($key == 't2.code'){
$sql .= "and t2.code = ? ";
$param[] = $val;
}else{
$sql .= "and $key like %?% ";
$param[] = $val;
}
}

$param変数は、SQLを実行する際のパラメータ値を格納する為に追加してみました。

投稿2015/06/09 15:19

takayukiinaba

総合スコア1158

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

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

0

「サブクエリ」というものを使ってはどうでしょうか。

投稿2015/06/09 12:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

$search_paramにカラム名と一緒に、テーブル名と完全一致フラグを持たせてはいかがでしょうか。

lang

1$search_param[] = array('カラム名',’テーブル名’,完全一致フラグ[boolan]); 2

WHERE作成時

lang

1$sql .= $val[1].$val[0]; 2if ($val[2]) { 3$sql .= "=? "; 4} else { 5$sql .= "LIKE '%".?."%' "; 6}

投稿2015/05/31 01:29

編集2015/05/31 01:33
noise

総合スコア256

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問