2011-10-25 16 views
0

私は3列に索引を作成する必要があります。MySQLデータベースの設計:同じフィールドに複数の値

`gender` tinyint(1) NOT NULL default '0', 
`age` tinyint(2) NOT NULL default '0', 
`is_looking_for` varchar(30) NOT NULL default '' 

問題はVARCHARであり、このインデックスが使用されることはありません3番目の列です。私はそれをINTにすることはできません。この出会い系サイトでプロフィールを作成する各ユーザーは、「私は探しています」という質問に回答し、複数のオプションを選択することができます。
男性を探しています
女性を探している女性

1,3,5 

とMySQLのクエリは次のようになります:男性または女性、カップル(男性+女性)

は今、私はこの方法でVARCHAR(is_looking_for)フィールドにこの情報を格納するために探して

select from profiles where gender='$gender' and age between $minage and $maxage 
and is_looking_for LIKE '%$lookingfor%'; 

このクエリは非常に悪いですが、この問題の解決方法はわかりません。男性、女性、カップル(m + f)、カップル(f + f)など、各性別オプションごとに異なる列を作成する必要はありません。複数のインデックスを作成する必要があります。つまり、性別ごとに個別のインデックス:

KEY `gender` (`gender`,`age`,`female`) 
KEY `gender_1` (`gender`,`age`,`male`) 
KEY `gender_2` (`gender`,`age`,`couple_male_female`) 

など

私は、それぞれの可能な組み合わせに固有の番号を割り当てるには、その後、INTフィールドに、この番号を保存するためのアイデアを持っていたが、それはあまりにも難しいので、私はあきらめました。

誰かを助けることができますか?ありがとう。

答えて

0

おそらくENUMを作成する必要があります。 ENUMはそのためのものです。

は、ドキュメントを見てみましょう:http://dev.mysql.com/doc/refman/5.0/en/enum.html

+1

複数の値を持つことができます。おそらく、 'set'が' enum'よりも適切です。 –

+0

hair raisin、はい、私は "SET"を使うことができましたが、複数列のインデックスを作成する必要があります。私は、MySQLはそのようなマルチカラムインデックスtinyint + tinyint + setを使用しないと考えています。 "SET"は整数ではありません。私は間違っている? – tfe

2

は、あなたのデザインを正規化します。独自の一意のIDを持つ、それぞれの "探している"変数をリストする別のテーブルを作成します。

1. looking for male 
2. looking for female 
3. looking for male+female 
4. looking for ... 

その後、あなたのデートのテーブルにこの新しいテーブルをリンクする別のテーブル:その日の#を意味だろう

date_id looking_for_id 
69   2 
69   4 

が69女性を探している、またはされています... looking_for以来

+0

他の解決策が見つからない場合は、ありがとう、私はそれを行います。私は複数のテーブルから選択を避けようとしています。 – tfe

+0

単一の結合クエリですべての値を取得できます。 –

+0

Marc B、この結合クエリの例を教えてください。私は2つのステートメントに参加する方法を知らない。 profiles.useridを選択し、profiles.nickをプロファイルから選択します.propos.userid = lookingforTable.date_id where profiles.gender = '$ gender'および$ minageと$ maxageの間の年齢。 – tfe

関連する問題