通过在它们之间添加特殊字符来搜索单词

时间:2014-02-28 08:11:54

标签: php mysql

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

让我们说数据库中的一些文本语句是

  1. 您好我的名字是XXX2,我住在YYY ZZZ
  2. 我的名字也写成XXX-2,我住在YYY-ZZZ
  3. 有时它写成XXX 2,我住在YYYZZZ
  4. 让我们说现在我想通过PHP脚本在MySQL数据库中搜索包含“XXX2”或“YYY ZZZ”的语句。

    使用MySQL进行搜索只返回语句1)。我想要归还所有三个句子。

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

4 个答案:

答案 0 :(得分:0)

使用LIKE运算符可能

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

答案 1 :(得分:0)

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

SELECT 
    * 
FROM 
    mytable
WHERE 
    mycol 
LIKE 
    'XXX_YYY_ZZZ'

答案 2 :(得分:0)

SELECT * 
FROM  `table`
WHERE `column` LIKE  'XXX%'
OR `column` LIKE  'YYY%'

答案 3 :(得分:0)

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

查找XYZ2的变体:

    选择       *     来自xytest     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';