- ベストアンサー
データベースに検索条件を保存する方法とは?
- データベースに検索条件を保存する方法について解説します。
- 検索用のシステムを作成する際に、検索条件を保存する必要があります。
- ユーザの入力条件に合わせて条件テーブルのIDを取得する方法についても説明します。
- みんなの回答 (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番目の補足に対して答えようとしても答えられないのではないでしょうか? それは、まだ条件の洗い出しも整理もされていない状態でご質問されているのではないでしょ うか? そのような状態で、質問してもだれにも答えられないと思います。何故なら ご質問者様もまだ、仕様を理解していないからと思います。 多分今理解しているのは、ふわっと したイメージで合って、具体的なものではないからで す。そのような状態でご質問されてもそれを読んだ回答者の答えは千変万化してしまい ご希望の回答は得られないかと思います。 ご質問したときのテーブルイメージで、無理やりロジックを施しても全く使えないシステム (柔軟性も含めて)が出来上がるかと思います。 今の状態で、やることは情報の洗い出し、整理等(これはデータベース設計、正規化云々) をすることから始まるかと思います。 今の質問状況で、出来る/出来ないは判断できません。
その他の回答 (2)
- ToOrisugaru
- ベストアンサー率28% (80/280)
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を取得にはどうしたらいいでしょ >うか? 今のままでは、二つのテーブルの関係が成り立ってないですよね。 上記正規化を実施するともう少し、見えてくると思います。 テーブルの関係は、明確にしてください。
補足
少々テーブルがおかしかったせいでうまくいってなかったのかも。 やりたい事を説明すると、 DBに登録したアイテム全てに「数字Aの値が10~20の間」「文字Bがxに一致する」 というような条件が指定して、 ユーザの入力した値が、 個々のアイテムに付けた条件に一致している物だけを抜き出すような そのようなシステムを作りたいと思っています。 ただし、数字Aのような項目は数字Zじゃ足りなくなるくらいの種類になると思われます。 このような物を作成する場合、 どういうふうに作るべきなのでしょうか?
- ToOrisugaru
- ベストアンサー率28% (80/280)
いまいち、質問の意味が理解できないのですが! 上記コーディングを無視して、二つのテーブルから、ご質問の条件で抽出する sqlは、解りますか? まず、それを記述してみて、上記コーディングのどの部分がそのsqlの どの部分にどう置き換えたいのでしょうか? 上記コーディングの言語は何ですか?
補足
方法としては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文で書くという事は可能なのでしょうか?
お礼
こちらの説明がうまく出来ていなかったというのもありますが、 DBだけで自己完結させるのはかなり難しそうだという事が分かりました。 始めに準備していたDB間にプログラムをワンクッションさせる方法なら、 行いたい動作をする事が出来るので、 今回は妥協する事にします。