按空间分离关键字搜索MySQL数据库
我正在使用PHP和MySQL。我将在下面提供一个简单的表格:按空间分离关键字搜索MySQL数据库,mysql,keyword,sql-like,Mysql,Keyword,Sql Like,我正在使用PHP和MySQL。我将在下面提供一个简单的表格: ------------------------------------------------------ | id | text | ------------------------------------------------------ | 1 | The quick brown fox jumped over the lazy dog |
------------------------------------------------------
| id | text |
------------------------------------------------------
| 1 | The quick brown fox jumped over the lazy dog |
------------------------------------------------------
我希望用户能够使用空格分隔的关键字进行搜索。我有一个简单的SQL查询,它是SELECT*FROM table,其中的文本像%[$keyword]%
,这意味着如果我搜索“快速狐狸”,我将不会得到任何结果。有没有办法用空格分隔关键字,这样如果我搜索“快速狐狸”,它将运行3次搜索。一个代表“The”,一个代表“quick”,一个代表“fox”——删除所有空白。虽然它应该只显示一个结果,因为它都属于同一行,而不是3个,因为所有3个关键字都与行中的数据匹配
最好的方法是什么?我们欢迎所有关于如何做得更好的建议。谢谢
[编辑]
刚刚想到这个,用逗号分隔关键词是更好的选择吗?
< P>你可以考虑把单词分成一个或一个组。< /P>SELECT *
FROM tbl
WHERE
LOWER(`text`) REGEXP '\b(the|quick|fox)\b'
匹配项:
- 敏捷的棕色狐狸跳过了懒狗
- 快,抓住狐狸李>
- 我吃了蛋糕
- 棕色的狗
上来构造此表达式
$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表上的全文搜索功能,以防它能够满足您的需要。从您的描述来看,全文听起来并不完全符合您的要求,但您应该作为一种可能来审查它:我通过另一种连接查询字符串的方法实现了这一点 //此行包含四个用于搜索的单词
$str=“敏捷的棕色狐狸”强> //查询字符串以小块形式写入,存储在变量“$uquery”
$uquery=“从tablename where中选择*”强> //一个新变量“$keywords”将以数组形式保存这些值
$keywords=explode(“,$str”)
$keywords=array\u map(“mysql\u real\u escape\u string”,$keywords)强> //“$k”将存储数组中元素的总数,在本例中应保留“4”
$k=count($keywords)强> //定义变量“$i”等于零
$i=0强> //启动while循环,该循环将持续4次,因为在本例中我们只有4个关键字
while($i)几乎可以肯定,您应该在生成查询的代码中处理这个问题,而不是在MySQL中谢谢你的关心,@ruakh。不过我已经涵盖了这一点。我只是不想把所有的事情都放在我希望人们关注的事情上。但是再次感谢你。好吧,但我坚持我的说法,你几乎可以肯定应该在生成查询的代码中处理这一点,而不是在MySQL中。所以为了得到最好的答案,y您应该显示生成查询的代码。是的,@ruakh。正如我所问的那样,这将是最好的方法之一。:)好了。谢谢你关注这个问题,我的朋友。让我试试你在这里包括的一些东西。我应该使用[[::]]而不是\b吗?这似乎不能从“Qui”中得到任何结果,它必须是“快速的”-有什么解决方法吗?@MikeSanchez此模式只能得到整个单词。如果需要多个关键字的部分匹配,则需要使用多个
LIKE
子句和一些算法来构造查询。