• 締切済み

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