• ベストアンサー

複数フィールドの検索

MySQL5.0+PHP4.4で検索システムを作ろうとしています。 例えばフィールドが ID,TEXT1,TEXT2,TEXT3,・・・・・・TEXT20 とある場合で、 検索文字(KEYWORD)をTEXT10・・・TEXT20に対してかけたい場合どのような方法があるでしょうか? データ件数は1万件から2万件を想定しています。 テーブルの構造を変えるというものも含めアドバイス頂きたいです。

  • MySQL
  • 回答数5
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

#1回答者です。 >検索用フィールドを1つ作るということですね。 #2さんの指摘の意図は、そうではないはずです。 同じようなデータを、同一行の複数の列で管理することを問題にしています。 例えば、「表名((主キー列),列名1,列名2,・・・)」で表すとすれば、 次のような表にします。 氏名tbl((氏名id),氏名) 感想tbl((氏名id,通番),感想) 現状のTEXT10~20の各列は、別の行で管理し、氏名id毎に通番を付けます。 >TEXT10・・・TEXT20は検索結果を表示する際に必要なので残しておきます。 最終的な表示結果通りに、表の定義を合わせる必要はありません。そんなことをするなら、リレーショナルDBを使う意味がありません。 >例えばTEXT99というフィールドを作り検索用とします。 >この場合、TEXT10・・・TEXT20の文字列をTEXT99に入れる上手い方法はないでしょうか? 正規化をする気もなく、性能もどうでもいいなら、ビューでも作ったらどうでしょうか?各列を文字連結した結果で、仮想の列を定義すればいいのです。区切りとして、0x0000などを入れた方がいいでしょう。

NORI-AYU
質問者

お礼

ありがとうございます。 >同じようなデータを、同一行の複数の列で管理することを問題にしています。 はい。何となくですが分かります。 例えば以下のような場合、一般的にはどのようなデータベースにするのが良いのでしょうか? (物件ID,物件名,種類,県名,市町村,家賃,説明文,メモ)というデータを必要とします。 「種類」には、(賃貸・分譲・貸家・その他)と入力されるデータが決まっています。 ここまででは、 物件tbl(物件ID,物件名,種類ID,県名,市町村,家賃,説明文,メモ) 種類tbl(種類ID,種類名) とすればいいのは分かります。 HTMLフォームからの検索で例えば「キーワード」というテキストボックスに入力してもらい、その文字が(物件名,県名,市町村,説明文,メモ)のどこかに入っていればヒットするような物です。 アドバイスいただけますでしょうか。 お願い致します。

その他の回答 (4)

回答No.5

>「検索キーワードの仮想の列」とはどのようなものになるのでしょうか? #3回答で、 「ビューでも作ったらどうでしょうか?各列を文字連結した結果で、仮想の列を定義すればいいのです。区切りとして、0x0000などを入れた方がいいでしょう」 とヒントを出していましたが、分かりませんか?

NORI-AYU
質問者

お礼

ありがとうございます。 分かりました、やってみたいと思います。

回答No.4

#3回答者です。 TEXT10~20には「同じようなデータ」が入るような説明だったため、正規化を提案することになりました。 物件名、、県名、市町村、説明文、メモということであれば、それぞれ「性質が違うデータが入る」ということになります。 この表は、このキーワード検索以外に、どういう操作があるのでしょうか? 追加、削除以外には、このキーワード検索しかしないなら、行数が1~2万件と少ないようなので、検索キーワードの仮想の列を作ってもいいでしょう。

NORI-AYU
質問者

お礼

ありがとうございます。 説明不足で申し訳ありませんでした。 この表の用途は、 1.検索フォーム(種類「チェックボックス」,キーワード「テキストボックス」等)で検索条件を入力してもらい検索。 2.該当するものをWebで表示(物件tblのフィールド全て) と使いたいと思っています。 「検索キーワードの仮想の列」とはどのようなものになるのでしょうか?

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>テーブルの構造を変えるというものも含めアドバイス頂きたいです。 ということであれば、キーワードとなるTEXT○○のフィールドは ひとつにすべきです。 いわる「正規化」の基本ですので、最低限おさえておくとよいかと。

NORI-AYU
質問者

お礼

ありがとうございます。 検索用フィールドを1つ作るということですね。 例えばTEXT99というフィールドを作り検索用とします。 TEXT10・・・TEXT20は検索結果を表示する際に必要なので残しておきます。この場合、TEXT10・・・TEXT20の文字列をTEXT99に入れる上手い方法はないでしょうか? 2回入力するのが面倒なので。

回答No.1

もう少し具体的に説明してください。 >検索文字(KEYWORD)をTEXT10・・・TEXT20に対してかけたい場合 どういう意味でしょう? TEXT10~TEXT20の各列に対し、「文字が'ABC'で始まる場合」といった同じ検索条件を指定したいということですか? TEXT10~TEXT20は、どういったデータが入っているのでしょうか? データ型は、TEXT型を使おうとかって、思ってますか?

NORI-AYU
質問者

お礼

申し訳ないです。補足します。 検索文字には「みかん りんご ぶどう」等半角文字で区切られた文字を想定しています。 TEXT10には「みかんはおいしい」、TEXT11「赤いりんご」・・・等が入っています。 ID | TEXT1 | ・・・ | TEXT10 | TEXT11 | ・・・ 1 | 山本 | ・・・ | みかんはおいしい |赤いりんご| ・・・ 2 | 佐藤 | ・・・ | 柿はおいしい |りんご好き| ・・・ 3 | 山田 | ・・・ | 柿は嫌い |メロン | ・・・ な感じです。 この様な場合に、TEXT10~TEXT20に検索文字が入っているレコードを一覧表示したいのです。 (上記表の場合は、ID 1と2を表示) お願いいたします。

関連するQ&A

  • MySQLで日本語検索

    MySQL初心者のものです。 今PHPとMySQLを利用して検索システムを作っています。 しかし日本語検索がどうしてもうまくいきません。 一応「教えてgoo」でも探してみたのですが、解決しませんでした。 MySQLで、 テーブル名 table フィールド名 field とすると、 select * from table where field like '%キーワード%'; のように検索してみたのですが、思うような結果が返ってきません。 ネットで検索すると「senna」をインストールと書かれていましたが、 そういったものをインストールしなければMySQLで日本語検索は出来ないものなのでしょうか? ちなみに MySQL5.0 PHP5.2.1 を利用しています。

  • ACCESSの複数フィールドの検索

    私がしたい事はおそらくかなり初歩的なことと類推されますので、がっくりされないようにお願いします。 「報告書」のテーブルがあります。 その報告書のフィールドは 報告日 報告者氏名 A店の感想 B店の感想 C店の感想 となっていると考えてください。 このテーブルをもとに、表形式で一覧の出るフォームを作っており、この一覧のフォームフッターにテキストボックスがあります。 このテキストボックスに例えば「D商品」と入力してエンターを押すと「A店の感想 B店の感想 C店の感想」中に「D商品」が出てくるレコードすべてが抽出されるというようにしたいと思っています。 1つのフィールドでのやり方がとあるサイトにあったので、私は Private Sub テキスト28_AfterUpdate() Me.Filter = "A店の感想 like'*" & Me!テキスト28 & "*'" Me.FilterOn = True End Sub という式を作成しました。 これだと「A店の感想」フィールドにキーワードがあればヒットしますが、B店、C店にキーワードがあってもA店にキーワードが無ければ反応はありません。 これを3つのフィールドで出来るようにいくつか試してみましたがどれも失敗でした。 どのようにすれば、複数フィールドのキーワード検索・抽出が出来るのでしょうか。 私の取ったやり方に近いもの、別の全然違うやり方、ともに勉強になるので色々教えてください。 それと、これでも結構検索したのですが、検索ワードが不適切なのか、ありそうなニーズにも関わらずぴったりくるものを見つけられませんでした。 もしよければACCESSをわかりやすく学習出来るサイトを教えてください。有名そうなところをいくつかは知っております。

  • 複数のテーブルの検索について

    お世話になっております。 題名にありますように、複数のテーブルに登録のあるデータを、テキストフォームやチェックボックス、プルダウンなどのフォームで入力(選択)されたものを(PHPにて)検索したいと考えておりますが、googleなどで調べていても、キーワードが適切でないためか、得たい情報を得られずにおります。 以下のようなテーブル構成で、上記質問のような検索をする場合、(googleなどで検索するには)どのようなキーワードが適切でしょうか?ソースを教えていただくのが簡単ですが、理解を深めたいと考えての質問です。お忙しい中恐縮ですが、アドバイスのほど宜しくお願いいたします。 table_a id name address category table_b no id title subject 上記テーブルA、Bに設定されたフィールドを、各フォームににて入力(選択)されたフォームで一括で検索するソースを学びたいのです。 ※table_a と table_b にある id で紐付けています。

  • 一つのフィールドに複数の情報を持たせたいです。

    データベースに詳しい方!一つのフィールドに複数の情報を持たせたいです。 例えば複数のユーザを管理するテーブルにあるID(フィールド)を 複数個をデータベースに保存する場合どうすればいいのでしょうか? 言語はJavaで、データベースはMySQLを使っています。 ↓↓各フィールド(例) -------------------------- || userName || userID || ○○ID || -------------------------- 上記の 「○○ID」というフィールド に複数の値を持たせたいのです。 String型の配列、もしくはXMLをMySQLの一つのフィールドに保存する 事はできるのでしょうか? (もし出来るのならこちらを採用したいです) それとも○○IDに関連するテーブルを作成する(?) それか最悪の場合、ユーザが増えるたびにテーブルを一つ作成 して管理するか・・・・(避けたいです) 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • Access複数フィールドを対象とした検索

    こんにちは。下記内容での質問です。 Accessで複数フィールドを対象とした検索フォーム?検索テキストボックス?検索ボタン?のような機能を追加したいのですが…。 [注文テーブル]     注文ID:オートナンバー型 納期:日付/時刻型 注文No.:テキスト型 数量:数値型 [製番テーブル] 製番ID:オートナンバー型 注番ID:数値型 製番1:テキスト型 製番2:テキスト型 製番3:テキスト型 と二つのテーブルがあり、メイン(注文テーブル)/サブ(製番テーブル)フォームで注文IDをリンクフィールドとしています。 一つの注文が3個口です。製品に製番シールをそれぞれ貼って出荷するので、製番シールを参照してメイン/サブフォームから[製番1~3]に後から手入力して管理してます。 製番はアルファベットと数字の組み合わせで6ケタです。例)AB1234 そこで、ある製番一つを変更したい時に、どの注文の[製番1~3]に入っているか分からない旧製番を検索して新製番に変更する時があります。 出来ればVBAをあまり使わずに、"複数フィールドを対象にパラメータ入力"などして検索したいのですが…。 新たに検索クエリ/検索フォームを作成して検索・編集出来るクエリ/フォームを作成する感じでしょうか? 何卒、宜しくお願い致します。

  • 検索においてフィールド名+likeを複数使いたい

    環境:php+mysql ■やりたこと イメージ <form method="get"action="result.php"> <p> 検索ワード:<input type="text" name="key" /> 好きな果物: <select name="cate"> <option VALUE="0"> <option VALUE="りんご">りんご <option VALUE="みかん">みかん </select> <input type="submit" value="送信" />  <input type="reset" value="取り消し" /> </p> </form> と検索フォームをした場合 入力された内容が  検索ワード=愛媛  好きな果物=みかん だとすると みかんのカテゴリに属するレコードで 且つ  みかんのキーワードを含むname またはDescriptionフィールドに該当する 結果数を取得したいです。 補足: $cate(formのプルダウンで VALUE="xx" のxxが入ってきて  これはDB上フィールドに入っている日本語です。) $a(これは検索キーワードが入ってきます。) ■現在書いているphp $sql="select * from item where category=$cate and name like '%".$a."%' or Description like '%".$a."%' "; $datas = mysql_query($sql , $db ); $num = mysql_num_rows($datas); ←75行目 エラー結果 Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/xxx/result.php on line 75 おそらく、73行目の命令文が間違っていると思うのですが、どう対応するのか 検索しても対象になりそうなものがみつからず、、質問させていただきました。 アドバイスのほどよろしくお願いします。

    • ベストアンサー
    • PHP
  • MySQLで複数フィールドから同一語を検索するには・・・

    MySQLでフィールド数20程度のテーブルがあります。 全フィールドに対して、ある同一の語を検索するとき。 WHERE field1 LIKE "%検索語%" OR field2 LIKE "%検索語%" OR ... と書いています。 しかし、同一の検索語を何度も書くのはスマートではありません。 何か良い方法をご存知でしたら教えてください。

  • 複数フィールドの一括カウントはできませんか?

    MS-ACCESS2000です。 ID|field1 |field2|・・・ -------------------- 1 |10 |30 | 2 |20 |10 | 3 |30 |20 | 4 |10 |20 | 5 |30 |20 | ・ |10 |30 | ・ |30 |20 | ・ |10 |10 | 上記のようなテーブルについて、各フィールド毎の、 10、20、30それぞれの件数カウントしたいんです。 得たい結果としては、以下のようなものです。  |field1|field2|・・・ -------------------- 10|5(件) |30(件)| 20|11(件)|9(件) | 30|7(件) |22(件)| このフィールド数ですが、全部で200ありまして、 以前ここの回答で拝見した、 SELECT point, count(*) FROM Point GROUP BY point.point; ではとても処理できそうにないもので・・・。 どなたか、お知恵を頂ければありがたいです。 どうか、よろしくお願い致します。

  • 複数のtable

    mysqlとperlを勉強中です 2つのテーブルから同じIDの情報を取得したいです。 hoge1テーブルとhoge2テーブルのIDは共通で一致しています。 (実際にはフィールドはもっと多いですがわかりやすくしています) hoge1テーブルは3つフィールドがあります ID INT1 INT2 hoge2テーブルは3つフィールドがあります ID TEXT1 TEXT2 hoge1テーブルで取得するのは数字が一致したIDです SELECT id FROM hoge1 WHERE int1=10 or int2=10 ORDER BY id hoge2テーブルで取得したいのはhoge1テーブルで取得したIDのTEXTです。やりたいことはこんな感じです SELECT TEXT1,TEXT2 FROM hoge2 WHERE id=hoge1テーブルで取得したID ORDER BY id; while (my $rec = $sth->fetchrow_array) { push(@recs, $rec); } perlでは配列で取得して後で、foreachで100個ほどprintしています。 hoge2も同じように取得したいのですが、hoge2はフォームを空白で送信できるようになっているので値がなにもないときがあります 配列に入れてしまうと空白のレコードがあるとその分、配列がずれてしまいます hoge1テーブルで取得したIDとhoge2テーブルで取得したテキストのIDを一致させる方法はありますか? やりたいのはこうゆうことです。 テーブル1で値が一致しているIDを取得する テーブル2でテーブル1で一致したIDのテキストを取得する リレーションも考えましたが素人なのでピンときませんでした テキストのほうも配列で取得して100個ほどprintしたいのです よろしくお願いします

    • ベストアンサー
    • MySQL
  • MySQL 複数フィールドで不一致の抽出

    ジャンル  id ジャンル名 日 数 id ----+---------------+--------------+---------+------- 001 ワンピース 20110518 10 a001 001 ワンピース 20110518 6 a002 002 アクセサリー 20110518 5 b002 仮に、このようなデータがあったとします。 数時間後には、↓のように変更がかかって送られてきます。 001 ワンピース 20110519 7 a001 001 ワンピース 20110518 6 a002 002 アクセサリー 20110519 9 b002 データ配布元の問題で、内容が更新された時点で、まだデータが確定していないものは、前日のデータが混ざって送られてきます。 この仕様を改良することは、残念ながら全く不可能です。 しかし、このデータをそのままテーブルに取り込んでしまうと、当然、2行目が重複してテーブルに収まってしまい、その後のデータ抽出に支障がでます。 例の場合でいえば、既に存在している2行目のデータを捨て、1行目と3行目のみを抽出する方法を探しています。 そこで、全部のデータを持つのをテーブル1とし、新しく着いたデータ(0519を含む方)をテーブル2に一時保管て、 SELECT テーブル2.ジャンルid, テーブル2.ジャンル名, テーブル2.日, テーブル2.数, テーブル2.ID FROM テーブル2 LEFT JOIN テーブル1 ON (テーブル2.ID = テーブル1.ID) AND (テーブル2.数 = テーブル1.数) AND (テーブル2.日 = テーブル1.日) AND (テーブル2.ジャンルid = テーブル1.ジャンルid) WHERE (((テーブル1.ジャンルid) Is Null)); と不一致SQLをAccessで行ったところ、1行目と3行目までが抽出できました。 ジャンルid、日、数、id が一致しないものを取りだすという不一致クエリの改造です。 ところが、同じSQLを、本番であるMySQLで行ったところ、データが抽出できす、反応が無くなってしまいます。 サンプルでは件数を絞りましたが、実際には1回分のデータが1万件近くあり、さらにメインテーブルは60万件ほどになるため、量が多すぎるためとも思いますが、4時間経ってもクエリの結果が返って来ないのは、MySQLとなにか合わないのではないかと思います。 MySQLで、上記と同じく、ジャンルid、日、数、id の全てが一致しないデータを抽出する事は可能でしょうか? ちなみに、MySQLテーブルでは、idの前にインクリメントのフィールドを置き、インデックスもインクリメントのフィールドで作成してあります。 よろしくお願いします。