私は私のデータベース内の1つのフィールドを持っている:xfield
このフィールドは、ウェブサイトでの私の記事(製品)のための形式は次のとおりです。作る事前検索
weight|3kg|year|2009|brand|samsung|monitorsize|13"|modem|yes
は、今私は、事前検索を実行したいが。たとえば、私は13 "〜15"の間でモニターのサイズを検索したい
と重量1.5kg〜3.5kgの間
私はその検索ページをPHPで作ることができますか?
私は私のデータベース内の1つのフィールドを持っている:xfield
このフィールドは、ウェブサイトでの私の記事(製品)のための形式は次のとおりです。作る事前検索
weight|3kg|year|2009|brand|samsung|monitorsize|13"|modem|yes
は、今私は、事前検索を実行したいが。たとえば、私は13 "〜15"の間でモニターのサイズを検索したい
と重量1.5kg〜3.5kgの間
私はその検索ページをPHPで作ることができますか?
あなたは、データベースに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
i'm。 方法はありませんか?上記の回答に感謝します。 – ArlopA
2列は何のデータ型ですか?私は彼らがvarcharまたはテキストであると推測していますか? – ManseUK
あなたがそれを検索したいのであれば、このデータを複数の列に分割することをアドバイスします。それ以外の場合は、検索が遅くて簡単ではありません。 –
固定形式の列は、可変範囲に対して照会するのに適していません。それをキー:値テーブルに再度展開するビューを作成します。 – mario