Php MySQL返回缺少单词的结果
我有一个网站,上面有一个搜索栏,出售手机和平板电脑。如果搜索Php MySQL返回缺少单词的结果,php,html,mysql,search,Php,Html,Mysql,Search,我有一个网站,上面有一个搜索栏,出售手机和平板电脑。如果搜索Blackberry 9900,则不会返回任何结果,因为该产品名为Blackberry Bold 9900。我需要一个解决方案,显示相关的产品,如果一个字丢失 我试过这个: $words=explode("_",$name); foreach($words as $word){ $whereClause.= ' product_name LIKE "%'.$word.'%" OR'; } $whereClause=substr($
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的所有结果如何解决此问题以使结果具有相关性?您需要研究使用,因为LIKE运算符在这里对您没有帮助。更改
$whereClause.= ' product_name LIKE "%'.$word.'%" OR';
到
及
当然
这将只搜索名称包含搜索框中所有单词的产品(但不必仅搜索该单词)
也许MySQL全文搜索是更好的方法,但它只支持MySQL 5.6之前的MyISAM表。如果您真的想使用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';
但是,如果您的产品表很大(可能超过60万行),那么这个表的速度会很慢。
所以最好使用全文,因为如果使用得当,它会更快,我知道。在你的情况下-使用
和而不是或。正确的解决方案是使用全文
索引,而不是像使用mysql的匹配查询那样,从产品中选择*,其中匹配(产品名称)与('$words'),状态=1,删除=0,按产品顺序
。使用mysql的匹配查询,这将满足您的需要,并将表类型更改为innodb或myisam(两个搜索中的第一个搜索是什么),搜索“PHP MySQL全文示例”。这里有一个:
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';