• 締切済み

MySQLで複数フィールドから同一語を検索するには・・・

MySQLでフィールド数20程度のテーブルがあります。 全フィールドに対して、ある同一の語を検索するとき。 WHERE field1 LIKE "%検索語%" OR field2 LIKE "%検索語%" OR ... と書いています。 しかし、同一の検索語を何度も書くのはスマートではありません。 何か良い方法をご存知でしたら教えてください。

みんなの回答

  • mooboogie
  • ベストアンサー率68% (28/41)
回答No.3

#1さん、#2さんのパクリも込みで^^; set @ptn='検索語'; select ...... where instr(field1, @ptn) * instr(field2, @ptn) ... != 0;

svocm
質問者

お礼

こんなことができるんですね。 ごく単純な条件句しか書いたことがないもので、、驚きです。 もう少し、いろいろと勉強します。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

そもそも%データ%は全件を検索するため効率うんぬんを 論ずるような仕組みではないでしょう。 とはいえ、こんなん考えてみました。 concatしてしまうという手でいかがでしょうか? 単純にconcatすると繋ぎの部分がヒットする可能性があるので char(0)などセパレータをいれてみました。 わたしなら本番ではこんなことはしませんが あくまでも遊びということで。 WHERE concat(field1,char(0),field2) LIKE "%検索語%"

svocm
質問者

お礼

>そもそも%データ%は全件を検索するため効率うんぬんを >論ずるような仕組みではないでしょう。 たしかにそうですね。 concatは知りませんでした。勉強します。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

性能はどうでもよい、素人が遊びで使用する表でしょうか? 一つの表の異なる列に、同じパターン文字列のlike条件が何個も必要になるというのは異常です。まずは、表の列構成を見直しましょう。 例えば、(キー、情報区分、情報)という構成にすれば、like条件は1個にできます。 「個人的な遊びで使っており、性能はどうでもよく、取りあえず回避できればいい」というなら、変数を使用する方法があります。 set @ptn='%文字列%'; select * from t1 where c1 like @ptn or c2 like @ptn ~ or cn like @ptn;

svocm
質問者

お礼

ありがとうございます。 >性能はどうでもよい、素人が遊びで使用する表でしょうか? まぁそのようなものです。 ようするに登録全データからの検索について考えているのです。 たとえば、音楽ダウンロードサイトなどでは 多くの場合、検索フォームはひとつだけで、 そこに入力する検索語が何であれ、あらゆるフィールドにヒットしますよね。 そこに楽曲名を入力するか歌手名を入力するかは ユーザーに任せているわけです。 あるいは備考欄などの情報もヒットさせるかもしれません。 こういう場合、多くのフィールドに同一の語であいまいな検索をかける 必要があると思ったのです。 >例えば、(キー、情報区分、情報)という構成にすれば、like条件は1個にできます。 上記の例でいえば (キー、楽曲名)、(キー、歌手名)、、、 といったテーブルをたくさん作るということでしょうか。 Excelの表を読み込む都合上、出来ればひとつのテーブルにまとめたいのです。 レコード数もそんなに多くない(1000程度)ので、 このような表でもよいかと思ったのですが、やはり分散が望ましいのでしょうか。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • MySQLで日本語検索

    MySQL初心者のものです。 今PHPとMySQLを利用して検索システムを作っています。 しかし日本語検索がどうしてもうまくいきません。 一応「教えてgoo」でも探してみたのですが、解決しませんでした。 MySQLで、 テーブル名 table フィールド名 field とすると、 select * from table where field like '%キーワード%'; のように検索してみたのですが、思うような結果が返ってきません。 ネットで検索すると「senna」をインストールと書かれていましたが、 そういったものをインストールしなければMySQLで日本語検索は出来ないものなのでしょうか? ちなみに MySQL5.0 PHP5.2.1 を利用しています。

  • PHP+MYSQLでワード検索

    PHP+MYSQLでワード検索を作りたいです。 検索は二つのテーブルの中のいくつかのフィールドに対して行います。 例えばキーで結ばれたテーブルA、Bがあったとして、 テーブルAのフィールド1、フィールド2、フィールド3、 テーブルBのフィールド3、フィールド4、フィールド5のいずれかに [佐藤]という文字列が含まれているデータを取り出す という事をしたいのです。 select * from テーブルA A, テーブルB B where A.フィールド1 = '%佐藤%' or A.フィールド1 like '%佐藤%' or A.フィールド2 like '%佐藤%' or ... という書き方だと、検索対象フィールドやレコードが多いと速度が遅くなりそうな気がします。 フルテキストインデックスを使用して検索を作成しようと思ったら、日本語は対応していないという事でした。 何か良い方法はありませんか? アドバイスをお願いします。 また、上のテーブルA、Bのレコードデータが貼り付けられたHTMLファイルがあります(1レコードで1ファイル)。 HTMLファイルを変数に読み込み、文字列が含まれているかをチェックする方法を思いついたのですが、これは重くなりますか? 検索対象レコードは現在150程度ですが、将来的には数千~数万になると予想されます。

    • ベストアンサー
    • PHP
  • MySQLで期間指定でキーワード検索するには?

    PHPでMySQLを利用し開発を行っています。 検索ボックスにキーワードを入力して検索をしたいのですが、期間を指定して検索できるようにする方法が分かりません。 さらに1ページに五件ずつ表示するようにしています。 下記はキーワード検索として動いているプログラムです。 例は2つのフィールドから検索しています。 SELECT * FROM テーブル名 WHERE フィールド名1 LIKE '%$search%' OR フィールド名2 LIKE '%$search%' LIMIT 0, 5; これに BETWEEN 期間1 AND 期間2  を追加して完成させようと思っているのですが、 どうも上手くいかないので、どのように書けばよいか教えて下さい。 よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • 複数カラム検索で、LIKE "%検索語%"

    複数カラム検索をしたいと思い、リンク先の通り、 WHERE concat(field1,char(0),field2) LIKE "%検索語%" としたらうまくいったのですが、 そのページに書いてあることが気になるので、教えてください ▽MySQLで複数フィールドから同一語を検索するには・・・ - MySQL - 教えて!goo   http://okwave.jp/qa/q2634613.html ・char(0)て何でしょうか? >%データ%は全件を検索するため効率うんぬんを論ずるような仕組みではない ・どういう意味でしょうか? ・全件検索する際は、LIKE検索を使わないのでしょうか? 全文検索エンジン(?)を利用するのでしょうか? ・全件検索しなければ(例えば2カラムだけ)、LIKE検索を利用しても良いのでしょうか? ・あるいは、データ規模が少なければ、LIKE検索を利用しても良いのでしょうか? >本番ではこんなことはしませんがあくまでも遊びということで ・どういう意味でしょうか? ・concatで LIKE 検索を普通はしない、ということでしょうか? ・それとも、LIKE 検索で、char(0)などのセパレータを挟まない、ということでしょうか? ・あるいは、全件検索でLIKE検索を普通は使わない、ということでしょうか?

    • ベストアンサー
    • MySQL
  • MySQL WHERE句のLIKE検索

    初心者ですみません。 MySQL WHERE句のLIKE検索で、引っかかった文字列を 除いた項目を表示させるにはどうしたらいいでしょうか。 例えば、 SELECT * from [テーブル名] where [フィールド名] like '%あ%'; として、「あ」が入っているレコードを検索し、 該当しないレコードを表示させる。 どうか教えてください。よろしくお願いします。

  • 複数のフィールドにまたがる、ワード検索

    お世話になっております。 1つのテーブル内にある複数のフィールドを対象とした、DB内の検索スクリプトを以下の様に作っているのですが、半角などで区切り、いくつかのキーワードを入力すると、検索結果が返ってきません。 こちらの過去ログ等でも色々調べ、参考になりそうなものも数多くありましたが、スキルが乏しく解決に結びつける事が出来ずにいる次第です。 お忙しい中恐縮ですが、コードを記述するに当り、考え方などを踏まえた使用する関数などをご教授頂けたら幸いです。 ・・・結果的にお手数をお掛けしてしまう事となりますが、コードの丸投げだけは避けたいもので。。宜しくお願い致します。 mysql_connect('localhost','root','*******'); mysql_select_db('test'); //全てのカテゴリ if($category == 1){ if($ktype == 1){ $sql = "select * from member where nam like '%$nam%' or gyoushu like '%$nam%'…"; $result = mysql_query($sql); $rows = mysql_num_rows($result);

    • ベストアンサー
    • PHP
  • 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
  • 検索条件が複数の場合のインデックスの張り方

    Mysql5.0 + ASP.NETで開発中です。 サーバーはWindows2003サーバーです。 とある検索サイトを作っていますが、1テーブルのフィールド数が80くらいあります。 また、レコード数は常時100万件程度です。 このテーブルの検索を行うときに、ユーザーが任意の検索条件を設定できるような画面なのですが、実際に検索に使用されるフィールド数は最大で10です。 例えば、where a = 999 and b = 999 や where a = 999 and c = 999 and f = 999 や where b = 999 and d = 999 and f = 999 and g = 999 など、where句で使用されるフィールドがユーザーの指定により常に異なります。(999は任意の値です) ORDER BYに使用されるフィールド数は3です。 現状ではインデックスは張っていないため、かなり検索速度が遅いため、インデックスを張りたいのですが、どのような張り方がいいのかがわかりません。 このような場合、インデックスを張る方法として、どの方法が一番よいのでしょうか? 1.検索に使用される10つのフィールドに1つずつ張ればよい 2.検索に使用される10つのフィールドとソートに使用される3つのフィールドに1つずつ張ればよい 3.where句の組み合わせを全て考えて複合インデックスを張る必要がある。 4.その他 また、80フィールドのテーブルを適当に4つくらいに分けて、検索時に結合すれば早くなったりするものでしょうか?

  • 【Access】複数フィールドを対象とする検索

    Access上で「検索ボタン」をクリックすると、 「データ」フォームのフィールド1、フィールド2、フィールド3のいずれかに「検索条件1」の語を含み、かつ、フィールド4、フィールド5、フィールド6のいずれかに「検索条件2」の語を含むレコードを抽出できるようにしたいと思います。 検索条件はテキストボックスに入力するようにしており、テキストボックス名は「検索条件1」、「検索条件2」となっています。 以下のコードでやってみたのですが、「実行時エラー13、型が一致しません」というエラーが出てうまく抽出できません。 Private Sub 検索ボタン_Click() Dim filter1 As String filter1 = "フィールド1 like '*" & Me!検索条件1 & "*' or フィールド2 like '*" & Me!検索条件1 & "*' orフィールド3 like '*" & Me!検索条件1 & "*'" And " フィールド4 like '*" & Me!検索条件2 & "*' or フィールド5 like '*" & Me!検索条件2 & "*' orフィールド6 like '*" & Me!検索条件2 & "*'" DoCmd.OpenForm "データ", acNormal Forms!データ!.filter = filter1 Forms!データ!.FilterOn = True End Sub 「検索条件1,2」のテキストボックスがあるフォーム上の「検索ボタン」をクリックすると、 「データ」フォームが開き、検索をかけるという流れをイメージして作成 しています。 どなたか正しい記述を教えていただけませんでしょうか。 よろしくお願いいたします。

  • jspでMysql検索で困っています。

    jspでMysql検索で困っています、 コマンド画面で下記の入力をすると条件の検索が出来ます。 select * from kanagawa where fish like '%コイ%'; (8件中検索されるのは1件でそれが表示されます) jspで命令すると、違う結果が返されてきます。 String sql; sql="select * from kanagawa where fish like '%コイ%'"; ResultSet rs=db.executeQuery(sql); 最初は変数でテーブル名等受け取っていたのですがうまくいかなかったので直接検索文を入れたのですが結果は同じく違う物が検索されてしまいます。(fishのフィールド8件中5件が結果としてでます。) 何を調べても間違いなさそうですが・・ どうにもならず困っています、助けてください、お願いします。