按空格分隔关键字并搜索MySQL数据库

Mik*_*hez 4 mysql keyword sql-like

我正在使用 PHP 和 MySQL。我将在下面提供一个简单的表格:

------------------------------------------------------
|  id |                    text                      |
------------------------------------------------------
|  1  | The quick brown fox jumped over the lazy dog | 
------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我希望用户能够使用以空格分隔的关键字进行搜索。我有一个简单的 SQL 查询,SELECT * FROM table WHERE text LIKE %[$keyword]%这意味着如果我搜索“The quick fox”,我不会得到任何结果。有没有办法用空格分隔关键字,所以如果我搜索“The quick fox”,它将运行 3 次搜索。一个用于“The”,一个用于“quick”,一个用于“fox” - 删除所有空格。尽管它应该只显示一个结果,因为它都属于同一行而不是 3 个,因为所有 3 个关键字都与该行中的数据匹配。

做到这一点的最佳方法是什么?总是欢迎所有可以做得更好的建议。谢谢!

[编辑]

现在才想到这一点,用逗号 (,) 分隔关键字会是更好的选择吗?

Mic*_*ski 5

您可以考虑使用正则表达式 viaREGEXP将单词分成一个或一组。

SELECT * 
FROM tbl
WHERE
  LOWER(`text`) REGEXP '\b(the|quick|fox)\b'
Run Code Online (Sandbox Code Playgroud)

火柴:

  • 敏捷的棕色狐狸跳过懒惰的狗
  • ,抓住狐狸
  • 我吃蛋糕

不匹配

  • 棕色的狗

在 PHP 中,您可以通过在空格上拆分搜索字符串并|在转义每个组件后将其内爆来构建此表达式。

$str = "the quick brown fox";
$kwds = explode(" ", $str);
$kwds = array_map("mysql_real_escape_string", $kwds);
$regexp = "\b(" . implode("|", $kwds) . ")\b";
Run Code Online (Sandbox Code Playgroud)

然后REGEXP '$regexp'在您的语句中使用。

附录:

由于您没有在 OP 中提及它,我想确保您了解 MySQL 在 MyISAM 表上的全文搜索功能,以防它可以满足您的需要。从您的描述来看,全文听起来并不完全符合您的要求,但您应该将其视为一种可能性:http : //dev.mysql.com/doc/refman/5.0/en/fulltext-search.html