2012-02-23 126 views
17

SQL LIKE%我知道如何執行LIKE%查詢的SQL的一個值,像這樣:內部陣列

SELECT * FROM users WHERE name LIKE %tom%; 

,但如果我喜歡搜索詞來自於一個數組我該怎麼做呢?例如,假設我們有一個這樣的數組:

$words = array("Tom", "Smith", "Larry"); 

如何執行我的SQL LIKE%在我的數組一樣來搜索的話:

SELECT * FROM users WHERE name LIKE %[each_element_from_my_array]% 

,而無需把整個查詢中foreach循環或東西

編輯:我忘了提,我在CakePHP CakePHP的的找到條件(「所有」)方法中做這個,所以有點複雜的事情。

謝謝

+0

你的問題對於[tag:like-operator]標籤至少有5票。我可否請求你建議[標籤:sql-like]作爲[同義詞](http://stackoverflow.com/tags/like-operator/synonyms)? – Kermit 2013-04-02 18:41:14

回答

25
$sql = array('0'); // Stop errors when $words is empty 

foreach($words as $word){ 
    $sql[] = 'name LIKE %'.$word.'%' 
} 

$sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql); 

編輯:對於CakePHP的代碼:

foreach($words as $word){ 
    $sql[] = array('Model.name LIKE' => '%'.$word.'%'); 
} 

$this->Model->find('all', array(
    'conditions' => array(
     'OR' => $sql 
    ) 
)); 

這個東西讀了起來:http://book.cakephp.org/1.3/en/view/1030/Complex-Find-Conditions

+1

我的想法確切。很好的答案! 只需要小心,當有一個空數組,這將導致SQL錯誤... – 2012-02-23 15:37:39

+0

我認爲'OR 0'會做得很好...;) – 2012-02-23 15:45:04

+0

這將工作,但我怎麼做這個蛋糕裏面PHP發現('all')功能(請參閱編輯) – user765368 2012-02-23 15:45:48

4

你不能。它必須是鏈接field like %..% or field like %..% or ...。 A where ... in子句只提取字符串匹配,不支持通配符。

11

在標準SQL的情況下,這將是:

SELECT * FROM users WHERE name LIKE '%tom%' 
         OR name LIKE '%smith%' 
         OR name LIKE '%larry%'; 

由於您使用的是MySQL可以使用RLIKE (a.k.a. REGEXP)

SELECT * FROM users WHERE name RLIKE 'tom|smith|larry'; 
+0

'RLIKE'碰巧是一個絕對偉大的解決方案,謝謝! ! ;) – 2012-12-05 17:24:15

3

嘗試使用REGEXP

SELECT * FROM users where fieldName REGEXP 'Tom|Smith|Larry'; 
0

我剛上任的472084.

$sql = array('0'); // Stop errors when $words is empty 

foreach($words as $word){ 
    $sql[] = 'name LIKE %'.$word.'%' 
} 

$sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql); 

對於我自己的代碼,我不得不修改它,因爲它返回我一個錯誤SQL。 我發佈它的人讀誰的線程。

foreach($words as $word){ 
    $sql[] = 'name LIKE \'%'.$word.'%\''; 
} 

$sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql); 

他們之間的差異是關於報價,我的MySQL DB說有問題!所以我不得不從$sql[] = 'name LIKE %'.$word.'%' 逃脫報價,現在它的工作完美。

0

塊引用

/** * 內爆值的多維數組,分組字符當與 「[]」 塊不同。 * @參數數組$陣列內爆 * @返回字符串數組內爆* / 功能hoArray2SqlLike($陣列)的陣列 { 如果(!is_array($ array))return $ array;

$values = array(); 
$strings = array(); 

foreach ($array as $value) 
{ 
    foreach (str_split($value) as $key => $char) 
    { 
     if (! is_array($values[ $key ])) 
     { 
      if (isset($values[ $key ])) 
      { 
       if ($values[ $key ] != $char) 
       { 
        $values[ $key ]  = array($values[ $key ]); 
        $values[ $key ][] = $char; 
       } 
      } 
      else 
       $values[ $key ] = $char; 
     } 
     elseif (! array_search($char , $values[ $key ])) 
      $values[ $key ][] = $char; 
    } 
} 

foreach ($values as $value) 
{ 
    if (is_array($value)) 
     $value = '['.implode('', $value).']'; 

    $strings[] = $value; 
} 

return implode('', $strings); 

}

0

在這段代碼中我們不能得到在SQL查詢雙引號

$sql = array('0'); // Stop errors when $words is empty 

foreach($words as $word){ 
    $sql[] = 'name LIKE %'.$word.'%' 
} 

$sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql); 

SELECT * FROM person where name like %"Tom"% OR name like %"Smith"% OR name like %"Larry"%; 
// error in double quotes and % is out side of Double quotes . 

或者你也可以用逗號分隔值: -

$name = array(Tom, Smith, Larry); 

$sql="SELECT * FROM person"; 

    extract($_POST); 
    if ($name!=NULL){ 
    $exp_arr= array_map('trim', explode(",",$name)); 
    echo var_export($exp_arr); 
    //die; 
     foreach($exp_arr as $val){ 
     $arr = "'%{$val}%'"; 
     $new_arr[] = 'name like '.$arr; 
     } 

     $new_arr = implode(" OR ", $new_arr); 
     echo $sql.=" where ".$new_arr; 
    } 
     else {$sql.="";} 

回聲sql查詢是這樣的: -

SELECT * FROM person where name like '%Tom%' OR name like '%Smith%' OR name like '%Larry%';