进行预先搜索

时间:2012-01-05 09:30:35

标签: php mysql search

我的数据库中有一个字段:xfield
该字段对于我在网站中的帖子(产品)具有以下格式:

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

现在我想进行高级搜索。例如,我想搜索13“~15”之间的显示器尺寸 重量在1.5kg~3.5kg之间

如何使用php创建搜索页面?

1 个答案:

答案 0 :(得分:1)

你在数据库中使用CSV数据,这是一个非常糟糕的主意,它会让你变得大胆(在这里插入一个人拔出头发的随机图片)。
永远不要在数据库中使用CSV,这是一种反模式。

相反,您需要做的是重构您的数据库设计,只将一个值放在一个字段中 我猜你想要尽可能灵活。
在这种情况下,使用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;

指向外部表的链接可确保从有限的一致标识符池中选择您的单位和属性。

现在您可以使用以下内容查询您的数据库:

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