• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:データベースに検索条件を保存する事は出来るのか?)

データベースに検索条件を保存する方法とは?

このQ&Aのポイント
  • データベースに検索条件を保存する方法について解説します。
  • 検索用のシステムを作成する際に、検索条件を保存する必要があります。
  • ユーザの入力条件に合わせて条件テーブルのIDを取得する方法についても説明します。

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

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

>少々テーブルがおかしかったせいでうまくいってなかったのかも。  少々というレベルでなくて、そのもの正規化がされてないとdbとしてのポテンシャル  を引き出せません。 >やりたい事を説明すると、 >DBに登録したアイテム全てに「数字Aの値が10~20の間」「文字Bがxに一致する」 >というような条件が指定して、 >ユーザの入力した値が、 >個々のアイテムに付けた条件に一致している物だけを抜き出すような 上記文章をそのまま、解釈すると以下のようになりますけど、でもそうゆうことを 聞きたいわけではないですよね!  テーブル1  項目1△項目2△項目3  1△△△△△10△△x  2△△△△△30△△x  3△△△△△50△△x  4△△△△△15△△y  5△△△△△50△△z  select * form テーブル1 where 項目2 >=10 and 項目2 <=20 and 文字B=項目3 >そのようなシステムを作りたいと思っています。 >ただし、数字Aのような項目は数字Zじゃ足りなくなるくらいの種類になると思われます。  ここは、上記テーブルのレコードが(例では5件ですけど)何万件(?)にも  あると言いたいということですか? でも、元々の質問内容からそのようなことを  聞きたいわけではないですよね! >このような物を作成する場合、 >どういうふうに作るべきなのでしょうか? 私が思うに補足内容および質問内容から、条件もどんな条件があるのかも分析してないように 思えます。まず、条件は全て洗い出すものです。あるかも知れないでは設計はできません。 私の2番目の補足に対して答えようとしても答えられないのではないでしょうか? それは、まだ条件の洗い出しも整理もされていない状態でご質問されているのではないでしょ うか? そのような状態で、質問してもだれにも答えられないと思います。何故なら ご質問者様もまだ、仕様を理解していないからと思います。 多分今理解しているのは、ふわっと したイメージで合って、具体的なものではないからで す。そのような状態でご質問されてもそれを読んだ回答者の答えは千変万化してしまい ご希望の回答は得られないかと思います。 ご質問したときのテーブルイメージで、無理やりロジックを施しても全く使えないシステム (柔軟性も含めて)が出来上がるかと思います。 今の状態で、やることは情報の洗い出し、整理等(これはデータベース設計、正規化云々) をすることから始まるかと思います。 今の質問状況で、出来る/出来ないは判断できません。

mizutaki
質問者

お礼

こちらの説明がうまく出来ていなかったというのもありますが、 DBだけで自己完結させるのはかなり難しそうだという事が分かりました。 始めに準備していたDB間にプログラムをワンクッションさせる方法なら、 行いたい動作をする事が出来るので、 今回は妥協する事にします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.2

no1です。 多分、以下の例でテーブルイメージについてなのですが正規化されてないのではないでしょうか? >例 >cook_table >(name,condition,text) = >('ゆで卵',/*条件 1,2*/,'卵を茹でた物') >,('温泉卵',/*条件 1,2,3*/,'お湯に温泉をつけた物。茹でた物ではない') >,('目玉焼き',/*条件 1,4*/,'卵を焼いた物') たとえば、1レコード目 conditionの「/*条件 1,2*/」で1,2というのは、 condition_tableのIDですね? この条件は、可変(繰り返し項目なので)これだけで別テーブルになると思います。 別テーブルとした場合、cook_tableと、別テーブルとの関係はどのようになりますか? cook_tableのキーは何ですか? >condition_table >(id,condition_name, operator, value) = >(1, 'material', '=', '卵') >,(2, 'boil', '>', 10) >,(3, 'water_thermometer', '=', 70) >,(4, 'bake', '=', true)  このテーブルのキーは、idということで良いですか?  条件の中に、'boil'とか'water_thermometer'というのは、cook_tableの何を指して  いるのでしょうか? 項目名?cook_tableのどこにも存在してないですよね!  それとも、第3のテーブル? それとも上記2個のテーブルて不定長で作成? >イメージとしては、 >ユーザが入力した条件に一致するcondition_tableのidを取り出して、  ユーザーからは、どんな情報を入力すると考えているのでしょうか?  具体的に上記テーブルの内容の情報をもとに記述(例として)をお願いします。   >そのidに一致するcook_table>の項目を取得するという事をしたいと思っています。  ユーザーからIDを直接指定してもらうのでしょうか? >ユーザの入力条件に合わせてcondition_tableのidを取得にはどうしたらいいでしょ >うか?  今のままでは、二つのテーブルの関係が成り立ってないですよね。  上記正規化を実施するともう少し、見えてくると思います。  テーブルの関係は、明確にしてください。

mizutaki
質問者

補足

少々テーブルがおかしかったせいでうまくいってなかったのかも。 やりたい事を説明すると、 DBに登録したアイテム全てに「数字Aの値が10~20の間」「文字Bがxに一致する」 というような条件が指定して、 ユーザの入力した値が、 個々のアイテムに付けた条件に一致している物だけを抜き出すような そのようなシステムを作りたいと思っています。 ただし、数字Aのような項目は数字Zじゃ足りなくなるくらいの種類になると思われます。 このような物を作成する場合、 どういうふうに作るべきなのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

いまいち、質問の意味が理解できないのですが! 上記コーディングを無視して、二つのテーブルから、ご質問の条件で抽出する sqlは、解りますか? まず、それを記述してみて、上記コーディングのどの部分がそのsqlの どの部分にどう置き換えたいのでしょうか? 上記コーディングの言語は何ですか?

mizutaki
質問者

補足

方法としてはPHPを利用しています。 まずユーザが検索したい情報を入力  condition_name = boil,  value = 15 DBの情報を一致条件として 上の情報に一致するidをcondition_tableから探し出します。  ここで、  condition_nameと一致する項目をまずDBから全部抜き出して、  operatorとvalueの条件に一致するかを探し出すのが目的です。 一旦、condition_tableからcondition_nameに一致する情報を取得して、 [select * from condition_table where name = "$condition_name"] これをループで seach_ids = array(); foreach($dbDatas => $data){ switch($data['operator']){ case('>'): if(input_value > db_value) search_ids[] = $data['id']; break; /* 一部省略 */ default: break; } ここで取れたsearch_idsのidにor条件で一致した情報をcook_tableのconditionに一致させて取得します。 この中で、 [select * from condition_table~]からPHPのidを取り出す部分までを含めてsql文で書くという事は可能なのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 条件検索が出来るHPを作りたい

    趣味のグループでいろんなレポートを書いてもらっています。これを一般公開して条件で検索できるようなHPを出来れば無料で作りたいのですがどうすればいいのでしょうか。条件検索とは例えばクックパッドのように、材料名で卵、鰯で検索したら鰯のピカタ(鰯を卵で絡ませて焼いた料理)のレシピが出てくるようなことです。説明が拙くて申し訳ありません。

  • 3つのテーブルを連携した並び替えのSELECT文

    3つのテーブルを連携した並び替えのSELECT文について教えて下さい。 例えば次の3つのテーブルがあるとします。 COOK_TBL ---------------- COOK_NAME パスタ パスタ グラタン オムライス グラタン カレー ZAIRYO_TBL --------------- COOK_NAME ZAIRYO_NAME グラタン  鶏肉 オムライス 卵 オムライス 玉ねぎ パスタ   卵 パスタ   麺 COOK_KIOKU_TBL --------------- COOK_NAME オムライス グラタン COOK_TBLのCOOK_NAMEでグルーピングしたものに対し、ZAIRYO_TBLのCOOK_NAMEに存在するものは全て抽出し、 COOK_KIOKU_TBLのCOOK_NAMEとCOOK_TBLのCOOK_NAMEと一致するレコードは頭の方(COOK_KIOKU_TBLのCOOK_NAMEのレコード順)に並び替えられるようにしたいです。 得たい結果は次の通りです。 COOK_TBL ------------- COOK_NAME オムライス グラタン パスタ どうしても分かりません。 助けて下さい。 os: windows 7 eclipse: Version: 4.2.0

    • ベストアンサー
    • MySQL
  • 同じサーバーで、異なるデータベースを同時に開くことはできますか?

    1.タイトルの通り、同時に開くことができますでしょうか? 日本PHPユーザー会ホームページでは以下の方法でできるとの回答があります。 $con1 = mysql_connect(localhost, user_id , pass); $con2 = mysql_connect(localhost, user_id , pass); mysql_select_db("db1",$con1); mysql_select_db("db2",$con2); ======================================== db1 user_table user_id(int),user_name(var) ========================================== db2 main_table main_id(int),user_id(int) ======================================== $sql_user_name = "SELECT user_name FROM user"; $result_user = mysql_query($sql_user_name,$con1); $row_user = mysql_fetch_array($result_user); echo $row_user[user_name]; のようにやっても mysql_fetch_array()がでます。 mysql_queryは最後の接続を活かすとなっているのでこの部分の書き方を教えてください。 2.できたとしてリレーションを行うことができますでしょうか? つまり $sql_user_name = "SELECT user_name FROM db1.user_table,db2.main_table WHERE db1.user_table.user_id = db2.main_table.user_id" というようなことはできますでしょうか? 長文で申し訳ありませんが、どうかよろしくお願いします。

    • ベストアンサー
    • MySQL
  • 1対多結合で多を絞り込み条件とするSQLについて

    1対多で結合する場合に、多が絞り込み条件となった場合のSQLについての質問です。 たとえばカスタムテーブルを使ったSELECT文などで、このような絞り込み条件が必要になると思います。 まずカスタムテーブルの具体例として、たとえばユーザーテーブルがあったとします。 [user_table] id=INT //オートインクリメント user_id=VARCHAR //adminなどのユーザーID文字列 user_pass=VARCHAR //パスワードを保存※ハッシュ化した値 user_name=VARCHAR //山田太郎などのユーザー名 user_mail=VARCHAR //ユーザーのメールアドレス user_description=TEXT //ユーザーの自己紹介文 user_created=DATETIME //ユーザーの登録日 とりあえず、上記のようなデータをユーザーの基本データだとします。 このユーザーテーブルから、たとえば名前を元に検索するのは単純です。 たとえばこのような感じでしょうか。 SELECT * FROM user_table WHERE user_name = '山田太郎' このテーブル構造を変更することなくカスタムデータを追加したい(しかも柔軟に)という要望を実現するために、ユーザーカスタムテーブルを作ったとします。 [user_custom_table] id=INT //オートインクリメント relational_id=INT //user_table.idへの参照 custom_name=VARCHAR //カスタムフィールド名 custom_value=VARCHAR //カスタムフィールドの値 custom_name、custom_valueには、たとえばそれぞれ以下のような値が入るとします。 custom_name、custom_value Birthday 、1998/1/1 CompanyName 、○○株式会社 CompanyTel、000-0000-0000 CompanyAddress、東京都千代田区○○-○○ user_custom_table.relational_idはuser_table.idにリレーションしているとすると、INNER JOINして値を取得する方法は判ります。 ※カスタムテーブルに値がない場合という状況は無視できる仕様です。 たとえば、会社住所が東京都で始まるユーザのみを抽出すると、以下のような感じでしょうか。 SELECT user_table.* FROM user_table INNER JOIN user_custom_table ON user_table.id = user_custom_table.relational_id WHERE user_custom_table.custom_name = 'CompanyAddress' AND user_custom_table.custom_value LIKE '東京都%' ただ、この方法だと、誕生日が○月○日以前で、会社名に○○を含んで、会社住所が東京都で始まり…と検索条件が増えていった場合にINNER JOINがどんどん増えていって、いかにも効率が悪いと思えてなりません。 とりあえず適当に書いてみるとして、以下のような感じでしょうか。 SELECT user_table.* FROM user_table INNER JOIN user_custom_table AS custom_1 ON user_table.id = custom_1.relational_id INNER JOIN user_custom_table AS custom_2 ON user_table.id = custom_2.relational_id INNER JOIN user_custom_table AS custom_3 ON user_table.id = custom_3.relational_id WHERE custom_1.custom_name = 'CompanyAddress' AND custom_1.custom_value LIKE '東京都%' AND custom_2.custom_name = 'Birthday' AND custom_2.custom_value < '2001/1/1' AND custom_3.custom_name = 'CompanyName' AND custom_3.custom_value LIKE '%○○%' もっと効率の良い書き方、一般的にはこういう場面ではこんな書き方をするなど、識者の方から教えを請いたくて質問しました。 ※ちなみにDBはMySQLですが、とくにMySQLに限らない方法で答えを頂ける方がありがたいです。

    • ベストアンサー
    • MySQL
  • データの検索の為に列を増やすのは正しいのか

    現在mySQLの勉強中です。 テーブルtableにidとnameとunixtimeが格納されています。 登録件数30000件。idは、登録申請時に順に割り振られています。 unixtimeはnameに対応する人間の登録確定時を表したものです。 したがって、idとunixtimeの順番は必ずしも一致しません このデータから、PHPを使って登録確定日別でid、nameのリストをhtmlで作成したいと思います。 たとえば20001224.htmlには2000年12月24日に登録確定した人のリストが入っているようにしたいです。 このような出力を効率的に行うために、unixtimeからyearとmonthとdateを作成しました。データ型はすべてintです。 あるデータのunixtimeが2011/12/31の場合、yearは2011、monthは12、dateは31となります。 htmlを作成するにあたり、データベースからデータを出力しなければいけません。そのため、 まずdateが条件に一致するデータを抽出して配列にidとmonthとyearを格納し、 次にmonthが条件に一致するものを抽出して配列にidとyearに格納し、 最後にyearが一致するデータのidを抽出し、idに該当するデータをechoしようと考えています。 が、この方法は正しいのでしょうか。 SQLは検索にいろいろテクニックが必要で、方法を誤ると途端に検索速度が速くなったり遅くなったりすると聞きました。 列を増やすことで、メモリの使用量が増えて検索が遅くなったり、もしかしたらunixtimeで上手に検索する方法があるのかもしれないと思います。 どなたかこういう時はどういう検索を行うのが正しいのか、ご教示ください。 どうかよろしくお願いします。

    • ベストアンサー
    • MySQL
  • 2つのテーブルを結合する条件

    現在、MySQLを使用しており2つのテーブルの結合条件がわからないので教えてください。 name_masterとmeiboの2つのテーブルがあります。 meiboとname_masterを結合させてname_idとname_id2が日本語に置き換わった状態で 取得させたいと思っています。どのようにwhere句の条件を作成すればよいでしょうか。 取得する項目のイメージとしては以下の3つが取得できるようにしたいです。 「meibo.no, meibo.name_idの日本語, meibo.name_id2の日本語」 【name_masterテーブル】 id name 1  ポチ 2  タマ 3  ミケ 4  ハチ 5  タロウ 【meiboテーブル】 no  name_id  name_id2 1    3     1 2    4     2 3    5     3

    • ベストアンサー
    • MySQL
  • rails3で複数条件から検索して表示、送信

    はじめましてrails初心者です。 皆さまの知恵をご拝借できればと思います。 以下やりたいこと、プログラム含め考え方をご教授いただければと思います。 尚、環境はails3.0.5です。 ----やりたいこと------------------------------------- ・留学エージェント検索サイト: ・参照サイトURL:http://www.ryugaku-seikatsu.net/Agent/AgentSearchShow/ ※行きたい国や目的を選んでそれに対応する留学エージェント会社を検索して、表示する。 --------------------------------------------------- ------考え方--------------------------------------- ※上記サイトを参考にお願いします。 ◆table構成 ・companies(name,email) ・countries ・purposes ・prefectures テーブル、countries、purposes、prefecturesに一致するcompanyを検索して、表示したく テーブルsearchesを作ろうとしています。 searchesテーブル company_id country_id purpose_id prefecturer_id そもそもこのテーブル設計で合っているのかがわかりません。country_id、purpose_id、prefecturer_id をcompany_idに紐付けしたくて上記のような構成になりました。 もっと効率のよいテーブル設計があればご教授ください。 そして、searchesテーブルを各テーブルにbelongs_toでアソシエーションさせて 検索しようと考えていますが、何か腑に落ちません。 また、searchesにidをつけたままの方のがよいのか、外した方がよいのかわかりません。 一応やってみたこととして searchコントローラーを作ってみました。 def search  @searches = Search.where(:country_id => params[:country_id]).where(:puropose_id =>  params[:purpose_id]).where(:prefecture_id => params[:prefecture_id]) end view(検索結果) <% @searches.companies.each do |company| %> <li><%= company.name %></li> <% end %> 上記を実行するとエラーでcompaniesが定義されていないとでてきます。 これもなぜだか、よくわりません。 ---------------------------------------------------------- ------その他わからないこと-------------------------------- 上記サイトを検索して進んでいくと、フォームを入力してフォームデータを送信します。 その際、情報送信先がユーザー、自分、companyだとします。 ユーザー、自分は問題なくできるのですが、検索結果にマッチしたcompany にフォームデータを送信する際に、どのように送信したらよいのかがわかりません。 一応、comapaniesテーブルにemailを入れているのですが、どのように紐付けしてよいの かがわかりません。 ---------------------------------------------------------- これまで、本やサイトで勉強していたのですが、自分のやりたいことに マッチしている情報が見つからなくて、困っています。 基本はRuby on Rails 3 アプリケーションプログラミング (著者 山田 祥寛 ) で勉強しておりますが、まだまだ勉強不足です。 http://www.amazon.co.jp/Ruby-Rails-%E3%82%A2%E3% … まだまだかなりの初心者ですが、何卒宜しくお願い申し上げます。

  • 紐付いている3つのテーブルに対しての検索条件の指定がうまくいきません・・。

    紐付いている3つのテーブルに対しての検索条件の指定がうまく書けません。 3つのテーブルが紐付いています。 ・main_tableのIDと、note_id_tableのID ・note_id_tableのnote_IDと、note_value_tableのnote_ID main_table ID, name ----------- 1, aaa 2, bbb 3, ccc 4, ddd 5, eee note_id_table ID, note_ID ----------- 1, 1 1, 2 1, 3 1, 4 3, 5 3, 6 4, 7 4, 8 4, 9 5, 10 note_value_table note_ID, note_value ----------- 1, AAAA1 2, BBBB1 3, CCCC1 4, DDDD1 5, AAAA3 6, EEEE3 7, FFFF4 8, GGGG4 9, HHHH4 10, IIII5 検索の対象にしたいのは、note_valueです。 今まで、「note_valueに検索文字列が含まれている」main_tableのレコードを取得していました。 SELECT main_table.* FROM main_table LEFT JOIN note_id_table ON main_table.id = note_id_table.id LEFT JOIN note_value_table ON note_id_table.note_ID = note_value_table.note_ID WHERE note_value_table.note_value LIKE '%AAA%' 上記クエリだと、note_valueにAAAを含んでいるnote_ID:1,5を持つ、 main_tableのID:1,3のレコード、2件が返ってきます。 これを、検索文字列のNOT検索とAND検索に対応させたいのです。 NOT検索について、 WHERE NOT(note_value_table LIKE '%AAA%') としてみたのですが、main_tableのID:1,3,4,5のレコードが返ってきました。 期待した動作は、main_tableのID:2,4,5でした。 まず、note_value_tableにデータを持っていないmain_table.id:2はNULLのようで、 この条件では無視されてしまうようです。 また、main_table.id:1,3が返ってきてしまうのは、 main_table.id:1に紐付いているnote_IDの内、2,3,4と main_table.id:3に紐付いているnote_IDの内、6に条件が引っかかってしまうようなのです。 AND検索ですが、上記クエリの条件を WHERE note_value_table LIKE '%AAA%' AND note_value_table LIKE '%BBB%' としたところ、0件となってしまいました。 期待した動作は、note_valueにAAAとBBBを含んでいるnote_ID:1を持つ、 main_tableのID:1のレコード、この1件が返ってくることでした。 どうもこの条件だと、一つのnote_valueにAAAとBBBが含まれていないとHITしないようです。 結局JOINしているので、note_valueの数だけ同じmain_tableが前にくっついてるイメージなんですよね。 main_tableのレコード末端に、紐付いているnote_valueのフィールドを横に繋げるか、 紐付いているnote_valueの文字列を連結したものを一つのフィールドとして解釈するようなことができれば 実現できるのかなぁと思いました。 試行錯誤の末に、パフォーマンスが非常に悪いんですが、下記クエリで機能的には実現できたのですが、 これでは使えないので何かいいアイディアなどあればご教授お願いしたいです。 サブクエリを使いたくないというのがあります。 --AAAの検索 JOINする時に検索してしまうようにしてみました。 また、そのためには、note_id_tableからnote_IDを取得できていないとだめなので、 サブクエリ化してみました。 SELECT main_table.* FROM main_table LEFT JOIN note_value_table ON note_value_table.note_ID IN (SELECT note_ID FROM note_id_table WHERE main_table.id = note_id_table.id) AND note_value_table LIKE '%AAA%' WHERE note_value_table.note_value IS NOT NULL --AAAのNOT検索 WHERE条件を逆にするだけにしました。 --AAAとBBBの検索 検索条件1つに対して、JOINを増やしていくようにしました。 JOINが増えるのもそうですが、サブクエリも倍になってしまい、 検索条件を増やせば増やすほどパフォーマンスが落ちてしまいます。。 SELECT main_table.* FROM main_table LEFT JOIN note_value_table AS note_value_table1 ON note_value_table1.note_ID IN (SELECT note_ID FROM note_id_table WHERE main_table.id = note_id_table.id) AND note_value_table1 LIKE '%AAA%' LEFT JOIN note_value_table AS note_value_table2 ON note_value_table2.note_ID IN (SELECT note_ID FROM note_id_table WHERE main_table.id = note_id_table.id) AND note_value_table2 LIKE '%AAA%' WHERE note_value_table1.note_value IS NOT NULL AND note_value_table2.note_value IS NOT NULL

    • ベストアンサー
    • MySQL
  • 動的な(?)値のつくりかた

    user_table --------------- user_id user_name posts --------------- entry_table --------------- entry_id user_id document このようなテーブルがあったとして、 user_tableのpostsの値を entry_tableのなかのuser_idが一致するレコードの数と同じにするには どのような方法がありますか? 文章がおかしいかもしれませんが、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • データベースの設計について

    現在PostgreSQL(ver 8.4)を使ってちょっとしたシステムの構築を計画していますが、データベースの設計に関して広くアドバイスを頂きたいです。 ユーザーの入力データをDBで効率よく管理したいと考えています。 例えば、次のようなテーブルを作るとします。 userテーブル id | name ---+------------- 1 | 山田太郎 2 | 高橋次郎 .. | ............. .. | ............. emailテーブル id | address ---+------------------------------ 1 | yamada@mail.com 2 | takahashi@mail.com .. | ................................. .. | ................................. この様な複数のテーブルにユーザーの入力を受け、1対1に対応するIDを振って名前やアドレスなどのデータをリアルタイムで挿入していく場合、どのようなテーブルを用意し、プログラムを組むのが適切なのでしょうか? 具体的には、PerlでCGIをつくり、ブラウザ上などからユーザーの入力したデータを取得してPostgreSQLに次々挿入していく形にしようとしています。 具体的なPerlのコードを書いていただけると助かるのですが、他の言語のコードでも一向に構いません。 今のところ、自分で考えたものとしては、 create table user( id serial, name text); create table email( id serial, address text); とテーブルを用意し、 Perlコードの概要は use DBI; # *実際にはユーザーの入力値から値を得る $input_user = 'name_hogehoge'; $input_email = 'address_hogehoge@mail.com'; # DBとの接続 $dbh = DBI->connect("dbi:Pg:dbname=hogehoge", ......); # プレースホルダの準備 $sth_user = $dbh->prepare("INSERT INTO user (name) VALUES(?)"); $sth_email = $dbh->prepare("INSERT INTO email (address) VALUES(?)"); # SQLの実行 $sth_user->execute("$input_user"); $sth_email->execute("$input_email"); # コミット $dbh->commit; といった感じで考えていました。しかしidの対応が確実に取れるかなど不安な点がありますので、アドバイスいただけたらと思います。 もちろんこの方法に固執する必要はなく、結果的に同じようなテーブルが得られれば問題ないです。 長々と失礼致しました。