dポイントプレゼントキャンペーン実施中!

お世話になります。

DBからSQLでキーワードによる検索をかけるときですが、
二つ以上のワードがあるときに、一つのキーワードがほかのキーワードと
かぶってしまう場合、例えば゛、『あいうえお』と『いうえ』等で絞り込むと、
結果的に『あいうえお』が含まれるものだけが該当しますが、これを、
『あいうえお』を含み、更にそれ以外にも『いうえ』が含まれるものを
絞り込むには、どうすればよいでしょうか。

つまり、『あいうえお』のみしか含まれないものは該当しないようにする方法です。

現在のSQLは、
(SELECT * FROM xxxx WHERE tablename LIKE '%あいうえお%' AND tablename LIKE '%いうえ%')
のような感じです。

使用しているDBは、MySQL、SQLiteです。

何卒よろしくお願いいたします。

A 回答 (5件)

SELECT * FROM xxxx WHERE tablename LIKE '%あいうえお%いうえ%' or tablename LIKE '%いうえ%あいうえお%'



って感じでどう?

この回答への補足

ご指摘の方法も悪くはないと思いますが、
かぶるキーワードが多くなるほど、SQLも長くなっていってしまいます。
コンパクトに収める方法はないのでしょうか。

補足日時:2014/04/23 16:36
    • good
    • 0

「カンマや空白で区切られたキーワードの羅列から単語検索」ではなくて、「通常の分かち書きされてない日本語文章から、自由単語検索」なのですよね?



英文のように分かち書きされていれば、前後に空白を入れた文字列で like 検索すれば、部分文字列のみのところと、長い文字列のところとは、個別マッチが可能
カラム値 例 ' きー ワード キーワード '
-- カラム値の前後にも区切り文字の空白を入れておくことで、先頭や最後もマッチさせ得る、検索時に、カラム値にも concat で前後に連結してもよいが時間的に無駄が多い。
条件式 例
where `カラム` like '% ワード %' and `カラム` like '% キーワード %'

分かち書きのない状態で、部分単語のみを見つけるには、perlくらいの強力な正規表現検索ができれば、可能かもしれないが、SQLiteは、正規表現検索させるには、ユーザー関数で組み込む必要がある、MySQLの正規表現検索やブール全文検索も、言明(xが前方にないaにマッチ)検索は実装されてないので、No2の方の回答のように、順番変えた組を作ってlike 検索くらいしかなさそう。OracleやpostgreSQL,Accessについてはよく知らない。
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。

やはり、簡単にはできないようですね。
やるとするならば、キーワードを全部つなぎ合わせてORで
探すといった方法しかないみたいです。

丁寧な説明、ありがとうございました。

お礼日時:2014/04/28 16:13

No3です。



ALLではなくINですね。失礼しました。
IN句を使ってキーワードのいづれかに該当するものを
取り出す、ということです。IN句の基本的な使い方
おわかりだと思いますが。
キーワードが複数あるということならば、ということで
他のテーブルを参照する方法を提案したのですが、

>また、要はユーザからの入力で検索をかけたいので、いちいちテーブルに
>するというのは、少し和漢が感じられます。

ということであれば、
検索キーワードが複数あり、その都度変更されるという
のであれば、Visual Basic、あるいはOffice系のソフト
たとえば、ExcelやAccessなどを使用してテキストボックスなり
他のコントロールなどに入力し、入力したキーワードを
VB、あるいはSQLを使って、SQLでデータを取り出しIN句でフィルタをかける、
あるいは、データベースにデータベースが理解する
SQl文を発行して取り出す、など考えられることはいろいろあります。
セキュリティ、トラフィック制限、使用条件などによって
作り方は変わって来ます。

この回答への補足

う~ん…

INというのは数ある中からひとつでも含まれていれば…という
ことですが、これとはちょっと用途が違います。複数のキーワードが
『全て』含まれていないと意味がないのです。

No.2の方が意味合い的には近いのですが、やはりキーワードが多いほど
条件分が長くなってしまいます。

やはり、簡単にはいかないのでしょうか…。

補足日時:2014/04/24 16:34
    • good
    • 0

キーワードがたくさんあるならば、キーワードの


テーブルを作っておき、SQLの中でALLを使って
テーブルのキーワード検索をする、というのは
どうですか。

SELECT * FROM xxxx WHERE カラム名その1 = ALL(SELECT カラム名その2 FROM キーワードテーブル)


ほかにも、SQLエンジンによって方法はあるとは思いますが。

この回答への補足

その方法では、キーワードがかぶっていても、別に検索はできるのでしょうか。

また、要はユーザからの入力で検索をかけたいので、いちいちテーブルに
するというのは、少し和漢が感じられます。

補足日時:2014/04/24 11:04
    • good
    • 0

それでいいんじゃないんでしょうか。

この回答への補足

書いてある例だと、『あいうえお』が一つだけふくまれているものも
該当してしまいます。

補足日時:2014/04/23 16:33
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す