0

ユーザーが入力できるフォームがあり、MySQL データベースでユーザーが選択したエントリを検索したいと考えています。たとえば、ユーザーがキーワードを入力し、オプション 2 と 3 をチェックした場合、キーワード AND オプション 2 AND 3 をデータベースで検索したいと思います。

ただし、データベースの設定方法がわかりません。オプションごとにテーブルに追加の列が必要ですか、またはテーブル内に配列を格納する方法はありますか? 私が思いついたもう 1 つの手法は、オプション用に別のテーブルを用意することでした。

以前にこれが行われたのを見たことがありますが、適切な実行についてはわかりません。誰かがこれを行う適切な方法を知っていれば、それは素晴らしいことです。

編集: これは場所 (たとえば、楽器店) のデータベースであり、オプションは販売されているさまざまな楽器です。ユーザーがフォームに入力すると、名前に「キーワード」文字列が含まれていて、ユーザーが選択した楽器を販売している店舗のリストを返したいと考えています。

適切なクエリを実行するためにデータベースをセットアップする方法がわかりません。各オプションをブール値を持つ個別の列として持つべきですか、それともブール値の配列を持つ列を持つことができますか?

注: 'Instruments' は多くのオプションの 1 つにすぎません。他の基準でフィルタリングできるようにしたい

HTML :

    <form>
         <input type="text" name ="Keyword" value="keyword"/><br/>
         Option 1<input type="checkbox" name="Option 1" value="option1"/><br/>
         Option 2<input type="checkbox" name="Option 2" value="option2"/><br/>
         Option 3<input type="checkbox" name="Option 3" value="option3"/><br/>
         Option 4<input type="checkbox" name="Option 4" value="option4"/><br/>
         <button type="submit">Submit</button>
    </form>

提案された DB 構造:

id  |  store_name  |  guitar  |  piano  |  saxophone  |  cello  |
 1     mike\'s music   true      false      false        true

また:

id  |  store_name  |  instruments  |
1     mike\'s music    Array[2]
4

1 に答える 1

0

提案された DB 構造:

stores
id  |  store_name
 1     mike\'s music

instruments
id  |  desc
 1     guitar
 2     piano
 3     saxophone 
 4     cello

stocks
id  |  store_id  |  instrument_id
1      1            1                 
2      1            4

したがって、クエリは次のようになります。

$query = "SELECT DISTINCT store_name
          FROM  stores 
          INNER JOIN stocks ON stores.id = store_id
          WHERE 1 = 1 ";
if ($keywords!="") {
          $query .= "AND store_name like concat('%','".$keywords."','%') ";
}
if ($option1!="") {
    $option[] = 1;
}
if ($option2!="") {
    $option[] = 2;
}
if ($option3!="") {
    $option[] = 3;
}
if ($option4!="") {
    $option[] = 4;
}
if (count($option)>0) {
    $query .= "AND instrument_id in (".implode(",", $option).")";
}
于 2013-09-03T17:46:33.043 に答える