0

我有一个带有销售手机和平板电脑的搜索字段的网站。如果您搜索Blackberry 9900它,它不会返回任何结果,因为该产品被称为Blackberry Bold 9900。如果缺少单词,我需要一个显示相关产品的解决方案。

我试过这个:

$words=explode("_",$name);
foreach($words as $word){
   $whereClause.= ' product_name LIKE "%'.$word.'%" OR';
}
$whereClause=substr($whereClause,0,-2);
$productQuery='SELECT * FROM products WHERE'.$whereClause.' AND status=1 AND deleted=0 ORDER BY product_order';

如果您搜索Blackberry Bold 9900,则返回所有包含的结果Blackberry我该如何解决这个问题,以便结果相关?

4

3 回答 3

1

您需要考虑使用FULLTEXT,因为 LIKE 运算符在这里对您没有帮助。

于 2013-09-06T14:33:12.253 回答
0

改变

$whereClause.= ' product_name LIKE "%'.$word.'%" OR';

$whereClause.= ' product_name LIKE "%'.$word.'%" AND';

$whereClause=substr($whereClause,0,-3);

当然。

这将只搜索名称包含搜索框中所有单词的产品(但不一定只搜索那些单词)。

也许 MySQL FULLTEXT 搜索是更好的方法,但它只支持 MySQL 5.6 之前的 MyISAM 表。

于 2013-09-06T14:39:14.707 回答
0

如果您真的想使用 like 运算符,那么您可以尝试这样的操作:

SELECT * 
FROM  products 
WHERE title LIKE  '%Blackberry%9900%'

我的意思是使用一个操作员您可以使用几个 % 字符。

因此,使用您的代码将是:

$words=explode("_",$name);
$whereClause=' product_name LIKE "';
foreach($words as $word){
   $whereClause.= '%'.$word;
}
$whereClause.='%"';
$productQuery='SELECT * FROM products WHERE'.$whereClause.' AND status=1 AND deleted=0 ORDER BY product_order';

但是,如果您的产品表很大(可能> 600k 行),那么这个表会很慢。所以最好使用 FULLTEXT,因为如果使用得当,它会更快,我怎么知道。

于 2013-09-06T14:46:31.653 回答