2011-11-05 90 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)'来表示。这一年应该总是最后一次。 –

相关问题