我正在使用PHP和MySQL。我将在下面提供一个简单的表格:
------------------------------------------------------
| id | text |
------------------------------------------------------
| 1 | The quick brown fox jumped over the lazy dog |
------------------------------------------------------
我希望用户能够使用以空格分隔的关键字进行搜索。我有一个简单的SQL查询,上面是SELECT * FROM table WHERE text LIKE %[$keyword]%
,这意味着如果我搜索“快速狐狸”,我将不会得到任何结果。有没有办法用空格分隔关键字,所以如果我搜索“快速狐狸”,它将运行3次搜索。一个用于“The”,一个用于“快速”,一个用于“狐狸” - 删除所有空白区域。虽然它应该只显示一个结果,因为它全部属于同一行而不是3,因为所有3个关键字都匹配行中的数据。
最好的方法是什么?我们欢迎所有建议做得更好。谢谢!
[编辑]
现在想到这一点,用逗号(,)分隔关键字是一个更好的选择吗?
答案 0 :(得分:4)
您可以考虑regular expression via REGEXP
将单词分成一个或一组。
SELECT *
FROM tbl
WHERE
LOWER(`text`) REGEXP '\b(the|quick|fox)\b'
匹配
不匹配
在PHP中,您可以通过在空格上拆分搜索字符串并在转义每个组件后将其重新插入|
来构造此表达式。
$str = "the quick brown fox";
$kwds = explode(" ", $str);
$kwds = array_map("mysql_real_escape_string", $kwds);
$regexp = "\b(" . implode("|", $kwds) . ")\b";
然后在您的陈述中使用REGEXP '$regexp'
。
由于您没有在OP中提及它,我想确保您了解MySQL在MyISAM表上的全文搜索功能,以防它满足您的需求。根据您的说明,全文听起来并不完全符合您的要求,但您应该将其视为可能:http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
答案 1 :(得分:3)
我是通过连接查询字符串的不同方法来实现的。
//此行包含四个用于搜索的单词
$ str =“快速的棕色狐狸”;
//查询字符串以小块写入,存储在变量“$ uquery”中 $ uquery =“select * from tablename where”;
//新变量“$ keywords”将值保存为数组
$ keywords = explode(“”,$ str);
$ keywords = array_map(“mysql_real_escape_string”,$ keywords);
//“$ k”将存储总数。对于这个例子,数组中的元素应该是“4” $ k = count($ keywords);
//定义变量“$ i”等于零 $ i = 0;
//启动一个while循环,这个循环将持续4次,因为在这个例子中我们只有4个关键字 while($ i< = $ k){
//这里有另一个新变量“$ uquery_”,下面的部分将与前一段“$ uquery”连接在一起 $ uquery_。=“转换主题(_utf8'%$ keywords [$ i]%'使用latin1)”;
//更多解释让我告诉你“$ keywords [$ i]”将如何帮助上面的代码,对于“$ i”的每个值,它将从数组中获取一个关键字,见下文:
// $ keywords [0] =“the”for $ i = 0
// $ keywords [1] =“quick”for $ i = 1
// $ keywords [2] =“brown”for $ i = 2
// $ keywords [3] =“fox”for $ i = 3
//现在连接逻辑&&在“$ uquery_”循环的每一轮之后的运算符,但不是最后一轮,因为查询需要在最后一个关键字后结束 if($ i!= $ k){$ uquery_。=“&&”; } 强>
//每轮后加1到$ i 的 $ I ++; 强> }
//现在我们的主要变量“$ uquery”正在与“$ uquery_”连接
$ uquery。=“$ uquery _”;
以上代码将生成以下查询:
从tablename中选择*,其中主题如convert(_utf8'%the%'USING latin1)&&像转换这样的话题(_utf8'%quick%'USING latin1)&&像转换这样的话题(_utf8'%brown%'USING latin1)&&像转换这样的话题(_utf8'%fox%'使用latin1)
注意:“topic”应该是mysql表中的列名,您可以将其替换为表中定义的列名。
我希望它能帮助一些人。如果您有任何问题,请随时通过我的网站上的实时聊天功能向我询问http://www.79xperts.com
问候
Adnan Saeed