2011-11-05 91 views
0

我有一個字符串,如Elton 1999和MySQL表有4個字段:Where field1 + field2 + field3 LIKE「%my_own_string%」?

table(id, name, surname, year) 

我必須檢查,加盟這些字段爲「單場」,它包含了我的字符串的所有單詞。

我的意思是:

 
1 Elton John 1999 -> must return the record 
2 Elton Peter 1999 -> must return the record 
3 Paris Elton 1999 -> must return the record 
4 Elto John 1999 -> must not return the record 
5 Elton Pierre 2000 -> must not return the record 

我可以與MySQL直接做,或我需要首先獲得所有記錄,並比分析它們在服務器端? (在PHP上,在我的情況下)

P.S.如果我的字符串是1999 Elton,則必須開始相同的結果,所以我的單詞的順序並不重要...

回答

2

只要輸入字符串格式一致,就應該可以使用CONCAT_WS()用空格作爲分隔符,並在查詢時將它們與輸入字符串進行比較。

+0

其實我不需要空白。 @Shredder解決方案看起來很棒... – markzzz

+0

+1空間分隔符 –

3
SELECT * FROM myTbl WHERE CONCAT(name, surname, year) LIKE '%ELTON%1999' 

SELECT * FROM myTbl WHERE CONCAT_WS(' ', name, surname, year) LIKE '%ELTON%1999' 

添加每個字段之間的空間。 Thx majic小兔子。那麼,如果你想搜索任何有任意順序值的字符串的任何列的可能匹配,那麼你可以通過空間分割你的字符串,並單獨搜索每個單詞。看看這個工程

$query = "SELECT * FROM myTbl"; 
if(!empty($searchString)){ 
    $query .= " WHERE "; 
    $arr = explode(' ', $searchString); 
    foreach($arr as $word) 
    $fields[] = "CONCAT_WS(' ', name, surname, year) LIKE %$word%"; 
    $query .= implode(" AND ", $fields); 
} 

PS - 我最近才知道這個查詢的建築技術從@yahyaE here :)

+1

這個解決方案看起來很好,並且很有效!謝謝 – markzzz

+0

呃...有問題:)'1999 Elton' does not work ...嘿嘿 – markzzz

+0

@markzzz o.O你不應該用'CONCAT(name,surname,year)'來表示。這一年應該總是最後一次。 –

相關問題