mysql:283
From: Shogo Hamamoto <Shogo Hamamoto <KHC01210@xxxxxxxxxx>>
Date: Mon, 19 Oct 1998 00:22:18 +0900
Subject: [mysql 283] Re:SQL
tommy@xxxxxxxxxx wrote: > Date: Sun, 18 Oct 1998 05:21:52 +0900 > From: 民斗 <tommy@xxxxxxxxxx> > Reply-To: mysql@xxxxxxxxxx > Errors-To: mysql-return-280-KHC01210=nifty.ne.jp@xxxxxxxxxx > To: mysql@xxxxxxxxxx > > MySQL を使った日本語文書検索システムを作ってみました。 > > が、会社の業務で作ったので、残念ながら公開できません…(^^; > > あらかじめ、chasen で文書を単語毎に区切り、名詞だけを抜き出して、 > MySQL で作ったキーワードテーブルに登録しておき、そのテーブルを検索する > という方式です。 > > まだサンプルデータの数が少ないですが、期待通り(期待以上かも)の速度で > 動いてくれてます。 > > で、一つ質問があります。MySQL というか SQL についての質問なんですが …。 > > 次のようなテーブル(T)に、文書番号(id)とキーワード(str)を登録してあると > します。 > > create table T (id int not null, str char(32) not null); > # index は省略 > > 1) "hoge" というキーワードと "fuga" というキーワードの両方を含む文書を > 検索する時は、次のようにできます。 > > select a.id from T as a left join T as b using (id) > where a.str="hoge" and b.str="fuga"; > > 2) "hoge" または "fuga" を含むという場合は、次でできます。 > > select id from T where str="hoge" or str="fuga"; > > ここまではいいんですが、もっと複雑な条件の時にどうすればいいのか > わかりません。例えば、 > > 「"hoge" または "fuga" を含み、かつ "herohero" も含む」 > > とか…。しかもそれをプログラムから自動的に生成したいのです。 > > どうも、1) と 2) の文法が違いすぎて、SQL では1行で書くのは無理のよう な > 気がしてるのですが…。 > > なんかうまい方法があるでしょうか? > -- > 民斗 <tommy@xxxxxxxxxx> 2)の構文の方がはるかに効率が良いのですが、プログラム的には UNIONを使って、検索結果のテーブルを結合する方法が、1)の構文に 近い形で記述できると思います。 UNIONは、複数のテーブルを(論理的に)結合する命令です。 ちなみに、MySQLのcrash-me(takeshiさんありがとう!)を見ると、MySQL ではサポートされていない機能でした。(残念) 参考までに、UNIONは、 AというテーブルとBというテーブル(テーブルはasで作った仮想テーブル でも良い)を結合する場合、 table A UNION table B と記述できます。AとBのテーブルの形式(フィールドの数等)は必ずしも一致して いなくても構いません。 (すみません。Netscapeの設定がうまくいってないのでおかしな表示になってい る かもしれません)