• ベストアンサー

MySQLで検索されたフィールド

いつもお世話になっております。 MySQLで以下のようなSQL文を発行しています。 select * from table where (INSTR(`table`.`name`,'キーワード')<>0 OR INSTR(`table`.`keyword`,'キーワード')<>0) nameカラムとkeywordカラムのどちらのカラムから検索されたのか知りたいのですが どのようにしたらよろしいでしょうか。 (「キーワード」文字列がどちらのカラムに入っているのか知りたいです。) [環境]  MySQL:5.5.16 よろしくご教示お願いいたします。

  • MySQL
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

状況がよくわからないけど select * ,(CASE WHEN INSTR(`table`.`name`,'キーワード') THEN 1 WHEN INSTR(`table`.`keyword`,'キーワード')<>0 THEN 2 ELSE 0 END) AS MATCH from table where MATCH>0 として、MATCHが1ならname,2ならkeyword・・・とか? ところで両方マッチする場合はどうしたいんでしょうね?

wonder_dct
質問者

お礼

yambejpさん、ご回答ありがとうございます。 ご提示いただきましたものを参考に解決できました。 ありがとうございました。

関連するQ&A

  • MYSQLで全てのカラムから検索する。

    tbというテーブルのbangというカラムに4が含まれていれば表示というのは select * from tb where (bang) like '%4%' ; という形になりますが、このtbテーブルにさらにname,tukiというカラムがあったとして カラムに関係なくレコードのどこかに4が入っていれば抽出するというSQL文が書きたいです。 select * from tb where bang like '%4%' or name like '%4%' or tuki like '%4%' ; と書くことで何とか今まではやってきたのですが、カラム数が増えてきてしまったので、ものすごく長いSQL文なってしまいました。 もう少しスマートにする方法はありませんか?

    • ベストアンサー
    • MySQL
  • 複数フィールドの条件について

    SQL文について教えてください。 oracle,mysqlでは、下記の条件分 where (fieldA,fieldB) in (select fieldA,fieldB from TABLE_NAME) と言った条件を記載可能なのですが、SQLServer ではエラーになってしまいます。 違った構文があるのでしょうか?よろしくお願いします。 具体的にやっているSQLは update TABLE_NAME set FIELD_NAME='1' where (FIELDA,FIELDB) in (select FIELDA,FIELDB from TABLE_NAME2 where FIELDC='1')

  • まったく別のテーブルの結果MYSQL

    table_1 id name age table_2 id book title city day SELECT * FROM table_1 WHERE id=? SELECT book,title FROM table_2 WHERE city=? このようにまったく別のテーブル カラム数も違う WHEREの?も違う これを一つのSQL文にまとめたいのですが。 UNIONなどを使ってもうまくいきませんでした。 ご教授お願いいたします。

    • ベストアンサー
    • MySQL
  • 2つフィールドを連結して検索するには

    MySQLの初心者です。よろしくお願いします。 1つのテーブルにある2つのフィールドのうち、どちらかにキーワードが入っている場合(両方に入っている場合も含む)を抽出したいのですが、検索するキーワードが1個の場合は、下記のようにすれば、うまく動くのですが、 ●1個のキーワードで検索する場合 (例として、2つのフィールドのうちどちらかに「山」のキーワードが入っている場合を抽出) select * from table WHERE (item_name LIKE "%山%" or outline LIKE "%山%" ) ●テーブルの内容(テーブル名:table) item_name | outline ==========+========= 山がある + 山と川 ----------+---------- 山がある + 川と森 ----------+--------- 山がある + 谷と林 --------------------- 質問したいことは、上記のテーブルから、item_nameとoutlineのフィールドのうち、2つのキーワード「山」と「川」が両方含まれるレコードを抽出したいです。上記のテーブルでいうと、抽出の結果、1行目と2行目が抽出したいのです。 ちなみに、下記のように記述したら、上記のテーブルで1行目だけ抽出されます。 select * from table WHERE (item_name LIKE "%山%" and item_name LIKE "%川%" or outline LIKE "%山%" and outline LIKE "%川%" ) 他にも、下記のように試してみたのですが、うまく抽出できませんでした。 SELECT * FROM table WHERE (concat(item_name,outline) LIKE '%山%' and concat(item_name,outline) LIKE '%川%') item_nameとoutlineのフィールドを結合して、結合した文字列で、「山」と「川」の両方が入っているレコードを抽出する方法はありますか? 2つのフィールドの文字列をあわせたなかから、「山」と「川」のキーワードが両方含まれるレコードを抽出したいのですが、何かよい方法はありますでしょうか。ご回答よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • phpとmysqlで「あいまい検索」をしたいです。

    phpとmysqlで「あいまい検索」をしようと思い、下記サイトを参考にしましたが、 http://d.hatena.ne.jp/akihito_sado/20120602/p1 PDOを使ってlikeデータを抜き出したい場合、bindParamを使うらしいですが、 http://rasukaru55.sitemix.jp/or_kensaku.php 下記の場合どう書き直すべきでしょうか? 打ち方が悪いのか、うまく作動しません。 教えてください。 ※bindParamを使えばSQLインジェクション対策になっていると言う事でしょうか? <html> <head></head> <body> <?php //POST送信されたデータを$text1へ $text1 =@$_POST["text1"]; //SQL(テーブルから列を抽出する $sql ="SELECT 列名 FROM 表名 "; //キーワードが入力されているときはwhere以下を組み立てる if (strlen($text1)>0){ //受け取ったキーワードの全角スペースを半角スペースに変換する $text2 = str_replace(" ", " ", $text1); //キーワードを空白で分割する $array = explode(" ",$text2); //分割された個々のキーワードをSQLの条件where句に反映する $where = "WHERE "; for($i = 0; $i <count($array);$i++){ $where .= "(列名 LIKE '%$array[$i]%')"; if ($i <count($array) -1){ $where .= " AND "; } } //別カラムも同じ検索したい $where2 = " OR "; for($i = 0; $i <count($array);$i++){ $where2 .= "(2列名 LIKE '%$array[$i]%')"; if ($i <count($array) -1){ $where2 .= " AND "; } } } ?> <form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>"> <table> <tr> <td><input type="text" name="text1"></td> <td><input type="submit" value="検索" name="sub1"></td> </tr> </table> </form> <?php //組み立てたSQL分を表示する echo "<p>組み立てたSQL分: ".$sql.@$where.@$where2; ?> </body> </html>

    • ベストアンサー
    • PHP
  • MySQLで戻り値が重複している

    PHPとMySQLを使っています。 下のようなSQL文を作成し、値を引き出そうとしています。 <SQL文> SELECT * FROM table_name WHERE A = "あ" AND B='い' <DBに登録済みの取り出したいデータ> あ、い、う、え、お ところが、戻ってくる値が、 あ、あ、い、い、う、う、え、え、お、お のように、値が重複して戻ってきます。 いろいろ調べましたが、原因がさっぱりわかりません。 ご存知の方、教えていただけると助かります。 よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • mysql_queryでDB検索をしたいが、結果が表示できない

    MYSQL関数の練習で、以下のソースを実行しました。selectDBなどの部分は省いております。 $sql_keyword = ereg_replace("[[:blank:]]+","%\" and name LIKE \"%",trim($word)); $sql = "SELECT * FROM shop where name LIKE \"%$sql_keyword%\""; $result = mysql_query($sql) or die('Query failed: ' . mysql_error()); echo "<table>\n"; while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) { echo "\t<tr>\n"; foreach ($line as $col_value) { echo convert("\t\t<td>$col_value</td>\n"); } echo "\t</tr>\n"; } echo "</table>\n"; mysql_free_result($result); で行うも、エラーなども無く、結果がブランクになってしまいます。 検索する文字列($WORD)に該当するレコードは複数存在します。 エラーなどもないため、原因がわかりません。皆様のお力をお借りできればと存じます。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • MySQLからフィールド名のリストを取り出し、一部のフィールド名を除外したい場合

    PHP + MySQLにて テーブルからフィールド名だけを取得し、さらに一部のフィールド名を除外したいです。 レコードじゃないのでis not構文は使えませんでした。 何かいい方法があれば教えてください。 $sql = "select * from table"; //tableテーブルからフィールド名を取り出し $rs = mysql_query($sql); $fields = mysql_num_fields($rs); $column = array(); for ( $i=0; $i<$fields; $i++ ) { $column[$i] = mysql_field_name($rs, $i); }

    • ベストアンサー
    • MySQL
  • mysql 全文検索で引っかからないワードがある

    mysqlのfulltextを使用した全文検索で引っかからないワードがあって困っています。 例えば、keywordsテーブルにwordsカラムに以下のレコードがあったとします。 -------------- ジェフ トム ram -------------- このとき、下記のsqlを発行してもジェフやramが引っかかりません。 SELECT * FROM `keywords` WHERE MATCH(words) AGAINST('ジェ*' IN BOOLEAN MODE); SELECT * FROM `keywords` WHERE MATCH(words) AGAINST('ram*' IN BOOLEAN MODE); (※以下は引っかかる SELECT * FROM `keywords` WHERE MATCH(words) AGAINST('トム*' IN BOOLEAN MODE); ) もちろん、カラム定義には、alter table keywords add fulltext(words)をしています。 またFull-Text Stopwordsもデフォルトのままです。 どんな原因があるか分かる方いらっしゃいますでしょうか? 以上、よろしくお願い致します。

  • PHP+MySQL

    PHP4で、MySQLに接続しています。 $connには、接続IDが格納されています。 以下のスクリプトで、「エラー」が出てしまうのですが、何故でしょうか? $sql = "SELECT (User_num, User_name, User_pass) FROM User WHERE User_name='$login_name'"; if (!$result= mysql_query($sql, $conn)){ die (print ("エラー")); } SQL文を、 SELECT (User_num) FROM User WHERE User_name='$login_name' と書き換えるとうまくいきます。複数にするとエラーというのはどうしてでしょう

    • ベストアンサー
    • MySQL