Sjoerd是正确的。关系数据库设置绝对是最好的解决方案。 我不知道关于MySQL FIND_IN_SET(),但你可以分析出用户的关键字并撰写字符串,因此您的搜索查询会因为这样的事情结束了:
SELECT * FROM `information` WHERE MATCH(`keyword`) AGAINST('keyword1 keyword3' IN BOOLEAN MODE)
在这种情况下,您的对阵应该返回如果它匹配任何一个。
您应该记住,“关键字”列必须全文索引,以便与工作匹配,并且仅匹配服务器上php.ini配置中定义的最小字符数。在大多数情况下,默认值是4个字符。 换句话说,您的关键字必须是4个或更多字符以使用匹配。 话虽这么说,你可以设置你的查询字符串做这样的事情:
$user_keywords = array('keyword1', 'keyword3');
if(count($user_keywords) == 1)
{
$word = $user_keywords[0];
if(strlen($word) >= 4)
{
$query_str = "MATCH(`keyword`) AGAINST ('".$word."' IN BOOLEAN MODE)";
}
else
{
$query_str = "`keyword` LIKE '%".$word."%'";
}
}
else
{
$query_str = "";
foreach($user_keywords AS $key)
{
$query_str .= "`keyword` = '".$key."' OR ";
}
$query_str = substr($query_str, 0, -3);
}
$sql = "SELECT * FROM `information` WHERE ".$query_str;
无论哪种方式,你这样做,你真的应该用你的数据库转换为关系建立开始,除非你别无选择 - 像你正在使用你没有编码的第三方软件包,它将需要永久转换。
另外,%在那里作为部分匹配的例子。如果您需要更多解释,请告诉我们。
来源
2010-06-17 19:25:41
Kai
谢谢你的建议,我会尽我所能在我能够尽快更改数据库结构 – user220755 2010-06-17 20:09:30
我得到了不是唯一的表/别名:信息 – user220755 2010-06-17 20:40:32
没关系,明白了:) – user220755 2010-06-17 20:47:19