質問 |
||
| 質問者:madman666 | スペースによる絞り込み検索をSQL文だけで実現したい | |
|---|---|---|
困り度:
|
単語がスペースで区切られている場合、 文字列を分割して配列に入れ foreachなどでANDを足していく方法が主流(?)なようなのですが、 これをSQL文だけで実現することは可能でしょうか? いろいろ調べたのですが、 SQL文にforなどの繰り返しがなさそうなのでむずかしいのかなと思っているのですが・・・ MATCHやAGAINSTを使って実現できますか? あるいはストアドプロシジャなどでも構わないのですが・・ 知識が乏しいので用語の使い方などもおかしなところがあるかと思いますが、よろしくお願いします。 |
|
質問投稿日時:08/03/23 12:30 質問番号:3887275 |
||
回答良回答20pt |
|
| 回答者:yambejp | もしかりに「鈴木 一郎」を分解して「%鈴木%」と「%一郎%」のANDを とったとしても、「鈴木一郎」のみをヒットさせることはできません。 たとえば「鈴木田 真一郎」さんとかいたらヒットします。 またLIKEでパフォーマンスが期待できるのは前方一致または後方一致の どちらかの場合のみです。 まぁ数万件レベルであれば%%のような構文でもそんなにスピードは 気にしなくても大丈夫でしょうけど、スピード重視なら全文検索でしょうね。 (2バイト文字の全文検索はMySQLのバージョンに依存します) 限られた用途だけでしたら#3さんのようなやり方で where name like CONCAT('%',replace('鈴木 一郎',' ',''),'%'); などとする手はあるでしょう きちんとやりたいなら、やはりSQLではなくプログラムレベルで 検索文字を分解して、SQLに渡してやる配慮が必要ではないでしょうか? 実際、キーワード渡しをするのであればそれなりのインタフェースが 必要でしょうし、インジェクション処理なども必要になるでしょうから 単純にはいきませんよ |
|---|---|
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/03/25 12:56 回答番号:No.4 |
|
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答良回答10pt |
|
| 回答者:nora1962 | 最初から全角スペースで区切られていると分かっているのなら。 where name like '%' || replace('鈴木 一郎',' ','') || '%'; で検索できると思いますが。 |
|---|---|
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/03/25 12:00 回答番号:No.3 |
|
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| 回答者:yambejp | >単語がスペースで区切られている場合、 具体的になにをしたいのかがわかりませんが そう言う場合は全文検索が効率的では? |
|---|---|
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/03/24 22:04 回答番号:No.2 |
|
| この回答への補足 | わかりにくくてすみません; たとえば、 id,name 1,鈴木一郎 2,山田二郎 3,佐藤三郎 4,田中四郎 というテーブル「member」があります。 現時点では、 検索フォームに「鈴木」と入れて検索できるまで作れたのですが、 「鈴木 一郎」のように、スペース区切りでの検索ができないのです。 $_GET['keyword']をcolnameに入れて、 WHERE name LIKE %colname% のようにしています。 この「鈴木 一郎」という入力値をスペースで分割して、 ANDでつないで、キーワードとして絞り込みたいのです。 つまりはyahooやgoogleのような検索ということでしょうか。 このようなものは全文検索で実現できるのでしょうか? ほんとうに説明が下手でもうしわけありませんが、 よろしくお願いします。 |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| 回答者:nora1962 | 回答ではありません。 何度読んでも、どういうデータがあってそこからどんな結果を抽出しようと しているのかイメージがつかめません。もう少し、具体的にイメージできる ような補足がないと回答がつかない気がします。 #私もMysqlのストアドプロシージャは分からないので、補足されても、答え #る自信はありませんが。 |
|---|---|
| 種類:補足要求 どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/03/24 21:39 回答番号:No.1 |
|
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |