人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

●質問者: esecua
●カテゴリ:ビジネス・経営 コンピュータ
✍キーワード:Google Hatena MySQL name SQL
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● vinaka
●30ポイント

http://090080.com/

?g?т?V?????090080.com

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

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

◎質問者からの返答

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


2 ●
●30ポイント

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文を生成すれば良いと思います。

http://www.forest.impress.co.jp/lib/inet/servernt/server/namazu....

????m - Namazu for Win32

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

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

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

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

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

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

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


参考になれば幸いです。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ