【问题标题】:Search for words by adding special characters between them通过在单词之间添加特殊字符来搜索单词
【发布时间】:2014-04-01 03:06:58
【问题描述】:

我有一个 MySQL 数据库,其中有一列包含一些我想搜索的文本。

假设数据库中的一些文本语句是

  1. 嗨,我叫 XXX2,住在 YYY ZZZ
  2. 我的名字也写成XXX-2,我住在YYY-ZZZ
  3. 有时写成XXX 2,我住在YYYZZZ

现在假设我想通过 PHP 脚本在 MySQL 数据库中搜索包含“XXX2”或“YYY ZZZ”的语句。

使用 MySQL 搜索只会返回语句 1)。我想返回所有三个句子。

我在想的一件事是在 PHP 中生成搜索字符串的所有排列并按顺序查询 MYSQL 数据库。这是最好的方法吗? PHP中有没有现成的函数来生成这样的组合?

【问题讨论】:

  • 为什么会返回另外两个?第 2 行和第 3 行既不包含“XXX2”也不包含“YYY ZZZ”。并告诉我们您正在做什么来访问数据。例如发布你的 SQL
  • 你的名字会有多少个这样的组合? XXX2、XXX-2、XXX 2、X XX2、XX X2 等?
  • @SajithNair 我知道会有特殊字符的确切位置。所以对于 XXX2,唯一有效的组合是 XXX 2、XXX-2、XXX2。
  • 因此您可以将特殊字符位置替换为 % 并像其他人在下面指定的那样进行 LIKE 查询
  • 所以会变成 name LIKE 'XXX%2'

标签: php mysql


【解决方案1】:

如果您知道单词部分之间需要哪些字符,您可以使用正则表达式来查询您的数据库。对于您的示例,这将起作用:

查找 XYZ2 的变体:

选择 * 来自xytest WHERE val RLIKE 'XXX[-]?2';

查找 YYYZZZ 的变体:

SELECT
  *
FROM `xytest`
WHERE val RLIKE 'YYY[- ]?ZZZ';

这使用MySQL's regular expression matching 允许在单词部分之间使用可选的-

如果之间可以有更多字符,您可以将 [- ] 更改为例如[- _](也识别_)或[^a-z0-9](每个非字母非数字)。大括号后面的? 使它的存在是可选的。

遗憾的是 MySQL 无法告诉您匹配的内容,但如果您需要知道,可以将相同的正则表达式提供给 PHP 的正则表达式引擎之一。

查找 XXX2 或 YYYZZZ:

SELECT
  *
FROM `xytest`
WHERE val RLIKE 'XXX[- ]?2|YYY[- ]?ZZZ';

当然

SELECT
  *
FROM `xytest`
WHERE val RLIKE 'XXX[- ]?2' OR val RLIKE 'YYY[- ]?ZZZ';

【讨论】:

    【解决方案2】:
    SELECT * 
    FROM  `table`
    WHERE `column` LIKE  'XXX%'
    OR `column` LIKE  'YYY%'
    

    【讨论】:

      【解决方案3】:

      如果您想使用 1 个字符变体进行搜索,请尝试以下操作:

      SELECT 
          * 
      FROM 
          mytable
      WHERE 
          mycol 
      LIKE 
          'XXX_YYY_ZZZ'
      

      【讨论】:

        【解决方案4】:

        也许可以使用 LIKE 运算符

        SELECT 
            * 
        FROM 
            mytable
        WHERE 
            mycol 
        LIKE 
            '%XXX%YYY%ZZZ%'
        

        【讨论】: