2012-02-23 107 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%';