2010-09-12 31 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+)'