2012-02-23 15 views
17

sé cómo realizar una SQL LIKE% consulta para un único valor de este modo:SQL LIKE% dentro de gama

SELECT * FROM users WHERE name LIKE %tom%; 

pero ¿cómo puedo hacer esto si los términos de búsqueda para mi COMO proviene de una matriz? Por ejemplo, supongamos que tenemos una matriz de esta manera:

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

¿Cómo realizo mi SQL LIKE% para buscar las palabras en mi matriz como:

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

sin poner toda la consulta en el interior un bucle foreach o algo

EDITAR: Olvidé mencionar que yo estoy haciendo esto en CakePHP dentro de las condiciones de la CakePHP find ('all') método, por lo que complica las cosas un poco.

Gracias

+0

Su pregunta tiene al menos '5' votos para la etiqueta [tag: like-operator]. ¿Podría solicitar amablemente que sugiera [tag: sql-like] como [sinónimo] (http://stackoverflow.com/tags/like-operator/synonyms)? – Kermit

Respuesta

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); 

Editar: Código para CakePHP:

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

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

Lea sobre estas cosas: http://book.cakephp.org/1.3/en/view/1030/Complex-Find-Conditions

+1

mi pensamiento exactamente. ¡buena respuesta! solo hay que tener cuidado cuando se tiene una matriz vacía que causaría un error de SQL ... –

+0

Creo que 'O 0' estaría bien ...;) –

+0

Esto funcionará, pero ¿cómo hago esto dentro de CakePHP find ('todos') la función (Ver edición) – user765368

4

No puede. Tendrá que ser un encadenado field like %..% or field like %..% or .... Una cláusula where ... in solo extrae coincidencias de cadena, sin compatibilidad con comodines.

11

En caso de SQL estándar, sería:

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

Dado que estás usando MySQL, puede utilizar RLIKE (a.k.a. REGEXP)

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

'RLIKE' resultó ser una gran solución para mí, ¡gracias! ! ;) –

3

tratar de usar REGEXP

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

acabo de tomar el código de 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); 

Por mi auto, tuve que modificarlo porque me ha devuelto un error SQL. Lo publico para las personas que van a leer el hilo.

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

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

La diferencia entre ellos es de aproximadamente cita, mi base de datos MySQL dijo que no es un problema! así que tuve que escapar de $sql[] = 'name LIKE %'.$word.'%' y ahora funciona perfectamente.

0

Blockquote

/** * Implode una matriz multidimensional de valores, la agrupación de caracteres cuando diferentes con el bloque "[]". * @param array $ array Matriz de implosionar * @return string La matriz implosión */ función hoArray2SqlLike ($ array) { if (!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

En este código no podemos obtener cotizaciones dobles en la consulta 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 . 

O también puede utilizar valores separados por comas: -

$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.="";} 

Echo consulta sql como este: -

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