• ベストアンサー

1つのテキストボックスに入力された複数のキーワードで検索する方法

開発言語はASPで、DBはSQL Serverを使用して、 現在プログラムの勉強をしております。 Search.aspというファイルで、 1つのテキストボックスに、 例えば、 佐藤 鈴木 のように入力し、 複数のキーワードで OR 検索をしたいのですが。 現在は下記のようなSQLを書いているのですが、 1つのキーワードでしか検索できませんので、 複数のキーワードで検索できるようにするには、 どのようにSQL及び、プログラムを記述したら良いのでしょうか。 dim name name = Request("name") sql = "select * from TABLE " sql = sql & "WHERE id <> 0 " if name <> "" then sql = sql & " AND (name LIKE '%" & name & "%') end if よろしくお願いいたします。

  • amile
  • お礼率70% (31/44)

質問者が選んだベストアンサー

  • ベストアンサー
  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.2

ちょっと間違えました。 flgFirst = True If Trim(name) <> "" Then ____'両端のスペースを除去後、空文字列かどうかを調べる ____If InStr(1, Trim(name), " ", 1) > 0 Or InStr(1, Trim(name), " ", 1) > 0 Then ________'文字列と文字列の間にスペースが無いかのチェック ________strBuffer01 = "" ________'全角スペースは半角スペースに置換 ________strBuffer02 = RePlace(Trim(name), " ", " ") ________Do Until strBuffer02 = "" ____________'スペースまでを切り取る ____________If InStr(1, strBuffer02, " ", 1) > 0 Then ________________strBuffer01 = Left(strBuffer02, InStr(1, strBuffer02, " ", 1)) ________________strBuffer02 = Mid(strBuffer02, Len(strBuffer01) + 1) ____________Else ________________strBuffer01 = strBuffer02 ________________strBuffer02 = "" ____________End If ____________If Trim(strBuffer01) <> "" Then ________________If flgFirst = True Then ____________________sql = sql & " AND ((name LIKE '%" & Trim(strBuffer01) & "%') " ____________________flgFirst = False ________________Else ____________________sql = sql & " OR ((name LIKE '%" & Trim(strBuffer01) & "%') " ________________End If ____________End If ________Loop ________sql = sql & ") " ____End If End If こんな感じですね。

amile
質問者

お礼

ご丁寧な回答ありがとうございました。おかげさまでうまく動作しました。

その他の回答 (2)

回答No.3

試してないですが、 Dim myArray Dim myVar Dim sqlWhere myArray = Split(Trim(name), " ", -1, 1) For Each myVar In myArray sqlWhere = sqlWhere & "(name LIKE '%" & myVar & "%') AND " Next sqlWhere = Left(myWhere, Len(myWhere) - 5) とか。 解説: Trim で両端のスペースを削除(全半角は同一で処理) Split でスペース(全半角は同一視)を区切り文字として配列に格納 For Each で配列をループさせながら WHERE 句を作成 最後にお尻についた余計な「 AND 」の5文字を削除 てなのはどうでしょうかね。 ただしこのままだとダブルクォーテーションやらシングルクォーテーションを入力した場合の手当をしないとダメです。 ' を '' 、 " を "" って二重化してあげないと。 それは別関数を作ってそっちに配列のループの中で myVar を投げて、Replace 関数で " を "" に、' を '' に入れ替えてあげるといいかも。 SQL 的に他に禁止文字があったような気がするなぁ・・・ 「|」はダメだったかなぁ・・・ Trim 関数 http://www.microsoft.com/japan/msdn/library/ja/script56/html/vsfctLTrim.asp Split 関数 http://www.microsoft.com/japan/msdn/library/ja/script56/html/vsfctSplit.asp For Each ステートメント http://www.microsoft.com/japan/msdn/library/ja/script56/html/vsstmForEach.asp Left 関数 http://www.microsoft.com/japan/msdn/library/ja/script56/html/vsfctLeft.asp Len 関数 http://www.microsoft.com/japan/msdn/library/ja/script56/html/vsfctLen.asp Replace 関数 http://www.microsoft.com/japan/msdn/library/ja/script56/html/vsfctReplace.asp

amile
質問者

お礼

ありがとうございました。クォーテーションなども考慮しないとダメですね。非常に参考になりました。

  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.1

見た感じで、 VBScirptを前提に。 _を半角スペースに置換してお使いください。 If Trim(name) <> "" Then ____'両端のスペースを除去後、空文字列かどうかを調べる ____If InStr(1, Trim(name), " ", 1) > 0 Or InStr(1, Trim(name), " ", 1) > 0 Then ________'文字列と文字列の間にスペースが無いかのチェック ________strBuffer01 = "" ________'全角スペースは半角スペースに置換 ________strBuffer02 = RePlace(Trim(name), " ", " ") ________Do Until strBuffer02 = "" ____________'スペースまでを切り取る ____________If InStr(1, strBuffer02, " ", 1) > 0 Then ________________strBuffer01 = Left(strBuffer02, InStr(1, strBuffer02, " ", 1)) ________________strBuffer02 = Mid(strBuffer02, Len(strBuffer01) + 1) ____________Else ________________strBuffer01 = strBuffer02 ________________strBuffer02 = "" ____________End If ____________If Trim(strBuffer01) <> "" Then ________________sql = sql & " AND (name LIKE '%" & Trim(strBuffer01) & "%') ____________End If ________Loop ____End If End If

関連するQ&A

  • 複数キーワードでのあいまい検索

     たびたびお世話になります。  PHPファイルのテキストボックスに入力された文字列でテーブルを検索して結果を取得したいのですが、複数キーワードでのあいまい検索の扱いで困っています。  例えばtitleというカラムにある「今日はいい天気です」という文を検索したい場合は、PHPからSQL文で「select * from table where title like '%天気%';」とやれば引っかかるのですが、では「今日 天気」でやった場合、また「いい 今日」で検索した場合も引っかかるようにしたいのです。  PHPで文字列を代入してSQL文を作る形になるとは思うのですが、この場合、SQL文はどのように記述すればいいのでしょうか?

  • like検索の複数キーワードで、プレースホルダを利

    like検索の複数キーワードで、プレースホルダを利用するやり方が分からないので教えてください <やりたいこと> ・複数キーワード検索(東京 hoge) <現状、出来ていること> ・1単語キーワード検索(東京) <分からないこと> ・配列として処理すれば良いみたいなのですが、プレースホルダとの絡みでどうすればよいのか分かりません <環境> ・MySQL ・PDO <現状コード抜粋> public function search($keyword)  {  $sql = "   SELECT a.*     FROM hoge a      WHERE (honbun LIKE :keyword)      ";  $keyword ="%".$keyword."%";

    • ベストアンサー
    • PHP
  • checkbokとキーワード検索を組み合わせた検索

    PHP4とMySQL4.0.22を使っています。 チェックボックスとキーワードで検索結果を表示させたいと思い。 下記のようにプログラムを作成したのですが、うまく検索表示してくれません。 PHPもMySQLも初心者なため、あちこちの構文を寄せ集めたため、Parseもうまく通っていません。 どこをどういう風にすればうまくいくのか、教えていただけないでしょうか? よろしくお願いします。 ----------------------------以下PHPファイル----------- 検索フォーム 検索キーワード:<input type=text name=\"k\"value='$k' size=45 > チェックボックス <INPUT TYPE=\"CHECKBOX\" NAME=\"bumon[]\" value=\"01:河川・砂防及び海岸\">01:河川・砂防及び海岸 ・・ "; //データ検索結果の実行部分 if($sig=="kb"){ $wk ==""; if($wk<>""){ //チェックボックス $sql = "select * from tecris where"; $sql .= " ("; $i=0; foreach($_POST['bumon'] as $fr) { if ($i) { $sql .= " or "; } $sql .= "bumon = '$fr'; $i++; } $sql .= ") and "; //キーワード if($k<>""){ $xk = str_replace(" "," ",$k); $gk = explode(" ",$xk); $wk ="keyword like '%$gk[0]%'"; $i = 1; $n = count($gk) - 1; while ($i <= $n){ $wk = $wk . " and keyword like '%$gk[$i]%'"; $i++; } } //クエリの作成 $sql = $sql . $wk; };

    • 締切済み
    • PHP
  • PHPで同じページに似た内容のデータベースを表示

    PHPで同じページに同じデータベース(table)から別の条件でリストを表示させています。 もっと簡単でスマートな方法はないか、ご質問させていただきます。 【表示例】 <鈴木さん> 鈴木たろう 090-0000-0000 鈴木まさゆき 080-0000-0000 鈴木あきこ 03-0000-0000 <佐藤さん> 佐藤まさる 090-0000-0000 佐藤ともみ 080-0000-0000 佐藤けいこ 03-0000-0000 【PHP】 <?PHP $sql = "SELECT name, tel FROM table"; $sql .= " WHERE name LIKE '%鈴木%'"; $recordSet = mysql_query($sql); $rows = mysql_num_rows($recordSet); if($rows){ while($row = mysql_fetch_array($recordSet)) { $table .= "".$row['name'].""; $table .= " ".$row['tel']."<br>"; $table .= "\n"; } } echo "<鈴木さん><br>"; echo $table; mysql_free_result($recordSet); ?> <?PHP $sato_sql = "SELECT name, tel FROM table"; $sato_sql .= " WHERE name LIKE '%佐藤%'"; $sato_recordSet = mysql_query($sato_sql); $sato_rows = mysql_num_rows($sato_recordSet); if($sato_rows){ while($sato_row = mysql_fetch_array($sato_recordSet)) { $sato_table .= "".$sato_row['name'].""; $sato_table .= " ".$sato_row['tel']."<br>"; $sato_table .= "\n"; } } echo "<佐藤さん><br>"; echo $sato_table; mysql_free_result($sato_recordSet); ?> 上記のように、同じデータベース(table)から、 「鈴木さん」「佐藤さん」それぞれ条件を設定して表示していますが、 もっと簡単に短いコードで表示させることは可能でしょうか。 また、可能であれば、それを何と呼べば(検索すれば)宜しいのでしょうか。 お願い致します。

    • ベストアンサー
    • PHP
  • MySQL+PHPでキーワード検索をもとに五十音検索を作りたいです

    キーワード検索のソースを元に五十音検索を作りたいです。 キーワード検索のソースを元に五十音検索を作りたいのですが、”あ”という文字を押したら”あ”の頭文字の一覧が出るようにするにはどうしたらいいでしょうか。 キーワード検索ではすでにキーワードを入れたら検索結果の一覧が出るようになっています。 以下が必要そうなコードの抜粋です。 <?php //抽出条件を組み立てる $array = explode(" ", $keyword); $cnt = count($array); $where = "WHERE "; for($i=0; $i < $cnt; $i++){ $where.= "koji OR kana LIKE '%".$array[$i]."%'"; if($i < $cnt-1){ $where .=" ".$searchSelect." "; } } // クエリを送信する $sql = "SELECT * FROM sampletable ".$where; $result = executeQuery($sql); //結果セットの行数を取得する $rows = mysql_num_rows($result); //表示するデータを作成 if($rows){ while($row = mysql_fetch_array($result)) { $tempHtml .= "<tr>"; $tempHtml .= "<td>".$row[no]."</td><td><A href='result2.php?koji=$row[koji]' target='_blank'>".$row[koji]."</A></td><td>".$row[kana]."</td>"; $tempHtml .= "</tr>\n"; } $msg = $rows."件のデータがあります。"; }else{ $msg = "データがありません。"; } ?> <h3>キーワード検索</h3> 故事成語用検索フォーム(複合語検索ができます) <form name="form2" action="search2.php" method="post"> <input type="text" name="keyword" size="25"> <input type="submit" name="search2" value="検索"><br /> </form>

    • 締切済み
    • PHP
  • PHP・MYSQL キーワード検索について

    HPにキーワード検索を導入しようと思っているのですがどうもうまくいきません。 現在は下記のように記述しています POSTパラメータを取得 $word = $_POST['word']; //SQL文 $sql = 'SELECT * FROM `table` WHERE `word` LIKE \'%$word%\' LIMIT 0, 30 ';    ↑ ここに直接ワードを入力したら正常に検索できました。 ポストで受け取ったデータを何かに変換しないと検索できないのでしょうか? 宜しくお願いします。

    • ベストアンサー
    • PHP
  • 複数キーワードの検索

    検索エンジンで確認しなくてはならない単語がたくさんあります。1つのキーワードで3000件以上ヒットするものもあり、時にはタイムアウトになってしまうものもありますが、ひたすら実行するしかありません。検索している時間の待ち時間などを考えると、なにか効率のよい検索方法はないかと考えてしまいます。1キーワードづつの検索ではなく、or検索でもなく、複数のキーワードの検索を予約することが出来て、それぞれ検索結果を出してくれるようなサーチエンジンをご存知ないででしょうか?または、JavaScriptなどでそのような仕組みを書くことができればそれでもOKです。宜しくお願いします。

  • 複数のカテゴリを選択した上でLIKE検索

    こんにちは、SQL文の書き方について悩んでいます。 PHPとSQLITE3で複数キーワードの検索プログラムを作ろうとしています。 自分用の日記をSQLITE3のDBに記録しているもので、 main のカラムに本文を書いて、  kuwake で、hobby、work、other などカテゴリー分けをしています。 ※一つの記事にたいして、選択可能なkuwakeは一つだけです。 趣味(hobby) と 仕事(work) のカテゴリー の中で、 複数文字検索をしたいのですが、 以下のSQL文で動作しませんでした。  正しいSQL文の書き方をご教授ください。よろしくお願いします。 "SELECT 'hobby' and 'work' ''FROM '$table' WHERE 'main' LIKE '%キーワード1%' and main LIKE '%キーワード2%' ■テーブルの詳細↓ CREATE TABLE table (id INTEGER PRIMARY KEY, main TEXT, kuwake TEXT, date TEXT);

    • ベストアンサー
    • PHP
  • 複数キーワードを含むセルを検索するには、どうすればいいのでしょうか?

    住所録にキーワードを入力することで、 対応する番号を検索してくれるような計算シートを作りたいのですが、 どうすればいいのか分からず困ってます。 例えば、下記のような住所録から、 "JAP" "鈴木" "一郎"というキーワードを入力すると 「xxx01」を出力してくれるようなものを作りたいのです。 ______________________________________ A |       B       |   C ______________________________________ 1|JAPAN 鈴木一郎   | xxx01 2|JAP 鈴木二郎    | xxx02 3|JAP 鈴木三郎    | xxx03 4|JAPAN 佐藤一郎  | xxx04 5|AMERICA 鈴木一郎 | xxx05 6|AME 佐藤一郎    | xxx06 ______________________________________ 上記のとおり、"JAP"だったり"JAPAN"だったり、表記ゆれがあるので VLOOKUPのような関数は使えそうに無いです。 関数でもマクロでも構わないのでいい方法があればご教授願います。 宜しくお願いいたします。

  • 自作の検索エンジンを作成しました。AND検索 or 検索の方法をご教授いただきたい。

    こんにちは。 複数のキーワードの検索が出来ません。 ゲーム 無料 等のキーワードで検索した場合のwhere句とのコラボ組み合わせが出来ません。 $keyword=$_POST[1]; $rs=$DB->$query("SELECT * FROM data WHERE"; if($keyword){ $str = array(" ", " and ", " AND "); $keyword = str_replace($str, " ", $keyword); if(stristr($keyword, " ")){//複数キーワードの検索 $ex = explode(" ", $keyword); $count = count($exkey); for($i=0; $i<$count; $i++){ if($i!="0"){ $sql = $sql." and"; } $sql = $sql." keyword LIKE '%{$ex[$i]}%'"); } }else{//単体キーワードの検索 $sql = " keyword LIKE '%{$keyword}%'"); } } $query = $query.$sql; $result = mysql_query($query); ...結果表示 これ今のソースですけど for のあたりに何か必要ない文字とか入っていますか。 色々しているうちに無駄に複雑にしてしまっているのではと言う感じもします。

    • ベストアンサー
    • PHP