2012-01-05 9 views
0

私は私のデータベース内の1つのフィールドを持っている:xfield
このフィールドは、ウェブサイトでの私の記事(製品)のための形式は次のとおりです。作る事前検索

weight|3kg|year|2009|brand|samsung|monitorsize|13"|modem|yes 

は、今私は、事前検索を実行したいが。たとえば、私は13 "〜15"の間でモニターのサイズを検索したい
と重量1.5kg〜3.5kgの間

私はその検索ページをPHPで作ることができますか?

+0

2列は何のデータ型ですか?私は彼らがvarcharまたはテキストであると推測していますか? – ManseUK

+4

あなたがそれを検索したいのであれば、このデータを複数の列に分割することをアドバイスします。それ以外の場合は、検索が遅くて簡単ではありません。 –

+0

固定形式の列は、可変範囲に対して照会するのに適していません。それをキー:値テーブルに再度展開するビューを作成します。 – mario

答えて

1

あなたは、データベースにCSVデータを使用している、これはあなたが大胆に(ここでは、髪を抜く人のランダムな画像を挿入する)ようになります本当に悪い考えです。
データベースでCSVを使用しないでください。アンチパターンです。あなたが何をする必要があるか代わりに

は唯一つのフィールドにある値を入れて、あなたのDB設計をリファクタリングすることです。
私は可能な限り柔軟になりたいと思っています。
その場合entity-attribute-valueモデル(EAV)を使用してください。

あなたのテーブルは以下のようになります

table properties (

id unsigned integer auto_increment primary key, 
product_id unsigned integer, 
attribute varchar(20) not null,  
astring varchar(100), 
anumber decimal(10,2), 
atype enum('string','integer','boolean','float'), 
unit varchar(10) not null, 
foreign key (product_id) references product(id) on update cascade on delete cascade, 
foreign key (attribute) references attribute(name) on update cascade on delete cascade, 
foreign key (unit) references unit(name) on update cascade on delete cascade 
) ENGINE = InnoDB; 

table unit (
name varchar(10) primary key -- "kg","inch",....... 
) ENGINE = InnoDB; 

table attribute (
name varchar(20) primary key -- allowed name for the attribute 
) ENGINE = InnoDB; 

外部表へのリンクは、あなたのユニットと属性が一貫性のある識別子の限られたプールから選択されていることを確認します。

は今、あなたはこのようなものを使用してDBを照会することができます

SELECT p.id, p.name 
FROM product p 
INNER JOIN properties ps1 ON (ps1.product_id = p.id) 
INNER JOIN properties ps2 ON (ps2.product_id = p.id) 
WHERE ps1.attribute = 'monitorsize' AND ps1.anumber BETWEEN 13 AND 15 
WHERE ps2.attribute = 'weight' AND ps2.anumber BETWEEN 1.5 AND 3.5 
+0

i'm。 方法はありませんか?上記の回答に感謝します。 – ArlopA

関連する問題