2009-01-23 225 views
32

LIKE运营商MySQL是用来查找包含我们的查询文本行,例如:MySQL:什么是LIKE的反向版本?

select name from user where name like "%john%" 

将返回John SmithPeter Johnson

如果我需要相反 - 找到在我们的查询文本中的行是CONTAINED?例如,我给它John Smith and Peter Johnson are best friends,并希望它找到我可以在该字符串中找到的表中的所有名称。

如何做到这一点?

+1

我也很困惑的问题。关于我的头顶,使用适当的全文本搜索引擎怎么样?狮身人面像还是Solr/Lucene? – 2009-01-23 06:43:58

+0

我认为这里需要的是这样的 从用户名中选择姓名(搜索字符串)“John Smith和Peter Johnson是最好的朋友”。输出应该是 Johm Smith,Peter Johnson等,只要它们是有名的。基本上是一个反向全文搜索。 – Dheer 2009-01-23 06:46:00

回答

43

这里有一个方法可以实现你的描述:

SELECT name FROM user 
WHERE 'John Smith and Peter Johnson are best friends' LIKE 
    CONCAT('%', name, '%') 
-2

这是一个文本索引问题。如果我做对了,你的任务就是在自由形式的文本中查找所有对人的引用,并且与LIKE或NOT LIKE无关。

在一般形式中,您要查找引用的数据库表充当一些文本索引算法的字典。使用这个字典在输入字符串上建立一个索引,并希望你会得到一些匹配。

1
select name 
from users 
where instr('John Smith and Peter Johnson', name) > 0 

我宁愿用这个方法来代替:

select * 
from users 
WHERE 'John Smith and Peter Johnson' LIKE CONCAT('%', name ,'%') 

,因为如果有任何机会,name可能包含%_字符(例如,name ='v%alue'),那么上述查询仍会错误地返回该记录。另请注意,如果您的专栏可能包含反斜杠和/或“C escape characters”,那么他们也需要转义。这全部在MySQL String Comparison Functions中解释。例如,下面的SQL将返回1:

SELECT 'val\%ue' LIKE CONCAT('%', 'al\\\\\%u' ,'%'); 

需要与\\\\转义的单反斜线和%字符被转义:\%