2013-03-11 78 views
0

我有一个手表在线商店。它有一个搜索过滤器。过滤的一个标准是手表的材质。它有很多独特的价值。例如:“钢”,“有金的钢”,“有镀金的钢”。麻烦在逻辑与mysql

我试图通过创建一个SQL LIKE请求过滤手表与钢身体,金身体过滤手表。但是,当搜索带有金色机身的手表时,它也给了我带有镀金的钢质手表,因为它包含“黄金”一词。

你能提出一个很好的解决方案来解决这个问题吗?

到目前为止,我试过这条SQL语句:

SELECT * FROM `watches` WHERE `material` LIKE "%gold%" 
+2

你可以请张贴你的代码吗?你试过什么了? – Barranka 2013-03-11 22:35:25

+0

使用sphinx_search,创建一个名为filters的表。将所有功能/过滤器插入此表中,并将其映射到各自的watch_id。索引这张表,你现在拥有所有的控制权。如果我不清楚,谷歌sphinx_search,它解决了这一切 – beck03076 2013-03-11 22:41:19

回答

2

如果我这样做,我会创建一个名为“Material”的表并为每个可用材料添加一条记录,然后将材质ID存储在watches表中而不是文字中。 (有许多的原因,这是更好的。)

材质表:

id - Material 
1 - Gold 
2 - Gold Plated 
3 - Silver 
4 - Steel with Gold 

然后在你的搜索中,您将允许用户选择他们感兴趣的材料和您的SQL看起来是这样的这个:

Select * from Watches where Material IN (1,4); 

这会带来一个手表是由黄金或钢与金制成。你的搜索会更快。

0
$criterium = "gold"; 
$query = mysql_query("SELECT * FROM watches WHERE material = '$criterium'"); 

应该解决您的问题。同时检查SQL LIKE条件以进一步查询

+1

这不会像你所拥有的那样工作。 'LIKE'在字符串中需要通配符('%'符号),否则就和使用equals相同。另外,'LIKE'查询非常慢 - 谨慎使用它们;如果你的数据库很大,你需要一个替代解决方案。 – Spudley 2013-03-11 23:00:15

+0

哦,我不知道他们很慢。我所理解的,他需要比较确切的单词,所以等于(=)应该可以正常工作。 – Mollo 2013-03-11 23:04:57