2010-09-12 104 views
2

如果我搜索LENA,我只想要得到的结果,其中LENA就是一个字,而不是像Lenason或安娜 - 莱娜或马莱娜PHP MySQL的搜索查询通配符问题

单词的一部分我怎样写这样的查询,而不是

"select * from users where name like '%LENA%'" 

应该改为什么?

+0

我看你未接受我的答案;什么地方出了错? – NullUserException 2010-09-12 04:40:02

回答

1

你可以使用REGEXP

SELECT fields 
    FROM users 
WHERE name REGEXP '(^|\s+)LENA($|\s+)' 
1

你可能会更好寻找到Full Text Search这一点。

否则,我认为你坚持做这样的事情

"select * from users WHERE CONCAT(' ',name, ' ') like '% LENA %'" 

,因为它需要进行全表扫描,这将是非常低效。

+1

**全文搜索**会做的伎俩,但是你的“类似”查询将会得到与原始相同的结果(但是具有更多的cpu开销)。 – 2010-09-12 11:34:54

+0

@Bob - 你说得对,我的查询存在问题,但没有你想到的我想的问题。我忘了你需要在MySQL中使用'CONCAT'来进行字符串连接,而不是'+'。连接空格的原因是,如果没有这个,那么'lena'是第一个,最后一个或唯一一个单词的名称将不匹配where子句的名称,如'%LENA%'。 – 2010-09-12 12:14:44

+0

在MySQL手册中查找'%',它也匹配零字符。这是我逻辑上的缺陷。 – 2010-09-12 13:14:23

4

使用这一个:

select * from users where name like '% LENA %' OR name like 'LENA %' OR name like '% LENA' OR name like 'LENA' 

试试,它会工作,并在开始和结束2个空格太简单了。 其漫长而快速的查询。你也可以使用全文搜索,Concat,Regex ...但对我来说,我喜欢简单,只需在%之前添加一些空格即可。

但是,你可以尝试短,但慢查询:

SELECT * FROM users WHERE name REGEXP '(^|\s+)LENA($|\s+)'