SELECT * FROM store WHERE
concat_ws(name, type, location) LIKE :search1 OR :search2 OR :search3
for($n=0; $n<$count; $n++)
$query->bindValue(':search'.$n, '%'.$search[$n].'%', PDO::PARAM_STR);}
}
我有一个搜索查询,我将用户的输入分解为数组,例如:array('i','love','apple');
我的问题是如何按最接近的匹配进行排序?
它搜索3列,因此如果用户输入new york apple,它将从location列返回许多内容与new york,并且许多内容与apple无关
答案 0 :(得分:4)
如果您想这样做,则需要全文搜索(http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html)。这比LIKE复杂一点,但肯定更快更智能。
答案 1 :(得分:2)
您可以在没有全文搜索的情况下执行此操作(默认值无论如何都不适用于您的查询,因为“i”不会被视为单词):
order by ((concat_ws(name, type, location) LIKE :search1) +
(concat_ws(name, type, location) LIKE :search2) +
(concat_ws(name, type, location) LIKE :search3)
) desc
这个订单最多的匹配最少。您的where
子句也需要遵循相同的格式,并有三个不同的like
子句。