(MySQL) SQL文お願いします。


hatenaというテーブルにwordとtitleとnameというカラムがあります。wordには単語が半角スペースで区切られて格納されています。(hatena google yahoo な感じ)

$search という変数に検索キーワードが格納されており各カラムに格納されている値に一致するもの、近い物を含むレコードを表示するにはどうしたらいいのでしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/03/07 01:17:29
  • 終了:--

回答(2件)

id:vinaka No.1

vinaka回答回数232ベストアンサー獲得回数12006/03/07 18:16:08

ポイント30pt

http://090080.com/

�g�тŗV�ڂ���090080.com

WHERE word LIKE ’%$search%’ or title LIKE...とselectしていけば、良いのでは?

ちなみにURLのサイトで使ってますよ。

id:esecua

正確なSQL文をお願いします。

2006/03/07 22:03:11
id:bonlife No.2

回答回数421ベストアンサー獲得回数752006/03/08 12:15:54

ポイント30pt

http://dev.mysql.com/doc/refman/4.1/ja/union.html

MySQL 4.1 リファレンスマニュアル :: 6.4.1.2 UNION 構文

「各カラムに格納されている値に一致するもの、近い物を含むレコードを表示」という部分について具体的なサンプル(こういう行を含むDBにたいしてこういう語句で問合せを行い、こういう出力を得たい!)を教えていただける適切な回答が付くような気がします。


質問文から推察すると、word、title、nameのいずれかの列に$searchという変数の値を含む場合、その行全体を表示する、という仕様かと思います。

(検討外れでしたら申し訳ありません。)


(SELECT * FROM hatena WHERE word like ’%$search%’)

UNION

(SELECT * FROM hatena WHERE title like ’%$search%’)

UNION

(SELECT * FROM hatena WHERE name like ’%$search%’)

;


それぞれの列に$searchが含まれるものを検索し、UNION句でその結果を結合しています。

(動作確認はしておりません。)

http://jp2.php.net/preg_split

PHP: preg_split - Manual

ただし、上記の例では、$searchに含まれる文字列が’hatena yahoo’である場合、’hatena google yahoo’を含む行はヒットしません。

$serachに複数の語句がセットされ、単語の順序も無視してヒットさせたい場合、SQLではなくプログラムの事前処理で単語に分割して検索する必要があります。

PHPの場合でしたら、$searchの値を preg_split() で半角スペースごとに分割して配列に値し、array_unique()で配列の重複を削除した後、配列の大きさ(語句の数)に応じてループを回してSQL文を生成すれば良いと思います。

検索の自由度を向上させたい場合、根性とスキルがあれば、有名な検索エンジンであるNamazuのソースコードを読んでみてはいかがでしょうか。

WEBやファイルの検索をするための検索エンジンですが、DBの検索にも応用できるはずです。

CとPerlで記述されています。

(私は読んだことありませんので悪しからず。)

http://arukikata.goo.ne.jp/article.php?ID=105&G1=1

【検索特集1】最強の日本語検索――「goo」が日本語に強い秘密とは……? - gooの歩き方

また、「値に一致するもの、近い物」のうち、「近い物」がいわゆる「あいまい検索」のようなものを想定している場合、単純にSQLで問合せすることは出来ません。これについては…大規模な類似語DBが必要になるんでしょうね。


参考になれば幸いです。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません