- ベストアンサー
複数フィールドの検索
MySQL5.0+PHP4.4で検索システムを作ろうとしています。 例えばフィールドが ID,TEXT1,TEXT2,TEXT3,・・・・・・TEXT20 とある場合で、 検索文字(KEYWORD)をTEXT10・・・TEXT20に対してかけたい場合どのような方法があるでしょうか? データ件数は1万件から2万件を想定しています。 テーブルの構造を変えるというものも含めアドバイス頂きたいです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#1回答者です。 >検索用フィールドを1つ作るということですね。 #2さんの指摘の意図は、そうではないはずです。 同じようなデータを、同一行の複数の列で管理することを問題にしています。 例えば、「表名((主キー列),列名1,列名2,・・・)」で表すとすれば、 次のような表にします。 氏名tbl((氏名id),氏名) 感想tbl((氏名id,通番),感想) 現状のTEXT10~20の各列は、別の行で管理し、氏名id毎に通番を付けます。 >TEXT10・・・TEXT20は検索結果を表示する際に必要なので残しておきます。 最終的な表示結果通りに、表の定義を合わせる必要はありません。そんなことをするなら、リレーショナルDBを使う意味がありません。 >例えばTEXT99というフィールドを作り検索用とします。 >この場合、TEXT10・・・TEXT20の文字列をTEXT99に入れる上手い方法はないでしょうか? 正規化をする気もなく、性能もどうでもいいなら、ビューでも作ったらどうでしょうか?各列を文字連結した結果で、仮想の列を定義すればいいのです。区切りとして、0x0000などを入れた方がいいでしょう。
その他の回答 (4)
- chukenkenkou
- ベストアンサー率43% (833/1926)
>「検索キーワードの仮想の列」とはどのようなものになるのでしょうか? #3回答で、 「ビューでも作ったらどうでしょうか?各列を文字連結した結果で、仮想の列を定義すればいいのです。区切りとして、0x0000などを入れた方がいいでしょう」 とヒントを出していましたが、分かりませんか?
お礼
ありがとうございます。 分かりました、やってみたいと思います。
- chukenkenkou
- ベストアンサー率43% (833/1926)
#3回答者です。 TEXT10~20には「同じようなデータ」が入るような説明だったため、正規化を提案することになりました。 物件名、、県名、市町村、説明文、メモということであれば、それぞれ「性質が違うデータが入る」ということになります。 この表は、このキーワード検索以外に、どういう操作があるのでしょうか? 追加、削除以外には、このキーワード検索しかしないなら、行数が1~2万件と少ないようなので、検索キーワードの仮想の列を作ってもいいでしょう。
お礼
ありがとうございます。 説明不足で申し訳ありませんでした。 この表の用途は、 1.検索フォーム(種類「チェックボックス」,キーワード「テキストボックス」等)で検索条件を入力してもらい検索。 2.該当するものをWebで表示(物件tblのフィールド全て) と使いたいと思っています。 「検索キーワードの仮想の列」とはどのようなものになるのでしょうか?
- yambejp
- ベストアンサー率51% (3827/7415)
>テーブルの構造を変えるというものも含めアドバイス頂きたいです。 ということであれば、キーワードとなるTEXT○○のフィールドは ひとつにすべきです。 いわる「正規化」の基本ですので、最低限おさえておくとよいかと。
お礼
ありがとうございます。 検索用フィールドを1つ作るということですね。 例えばTEXT99というフィールドを作り検索用とします。 TEXT10・・・TEXT20は検索結果を表示する際に必要なので残しておきます。この場合、TEXT10・・・TEXT20の文字列をTEXT99に入れる上手い方法はないでしょうか? 2回入力するのが面倒なので。
- chukenkenkou
- ベストアンサー率43% (833/1926)
もう少し具体的に説明してください。 >検索文字(KEYWORD)をTEXT10・・・TEXT20に対してかけたい場合 どういう意味でしょう? TEXT10~TEXT20の各列に対し、「文字が'ABC'で始まる場合」といった同じ検索条件を指定したいということですか? TEXT10~TEXT20は、どういったデータが入っているのでしょうか? データ型は、TEXT型を使おうとかって、思ってますか?
お礼
申し訳ないです。補足します。 検索文字には「みかん りんご ぶどう」等半角文字で区切られた文字を想定しています。 TEXT10には「みかんはおいしい」、TEXT11「赤いりんご」・・・等が入っています。 ID | TEXT1 | ・・・ | TEXT10 | TEXT11 | ・・・ 1 | 山本 | ・・・ | みかんはおいしい |赤いりんご| ・・・ 2 | 佐藤 | ・・・ | 柿はおいしい |りんご好き| ・・・ 3 | 山田 | ・・・ | 柿は嫌い |メロン | ・・・ な感じです。 この様な場合に、TEXT10~TEXT20に検索文字が入っているレコードを一覧表示したいのです。 (上記表の場合は、ID 1と2を表示) お願いいたします。
お礼
ありがとうございます。 >同じようなデータを、同一行の複数の列で管理することを問題にしています。 はい。何となくですが分かります。 例えば以下のような場合、一般的にはどのようなデータベースにするのが良いのでしょうか? (物件ID,物件名,種類,県名,市町村,家賃,説明文,メモ)というデータを必要とします。 「種類」には、(賃貸・分譲・貸家・その他)と入力されるデータが決まっています。 ここまででは、 物件tbl(物件ID,物件名,種類ID,県名,市町村,家賃,説明文,メモ) 種類tbl(種類ID,種類名) とすればいいのは分かります。 HTMLフォームからの検索で例えば「キーワード」というテキストボックスに入力してもらい、その文字が(物件名,県名,市町村,説明文,メモ)のどこかに入っていればヒットするような物です。 アドバイスいただけますでしょうか。 お願い致します。