2012-02-23 16 views
17

so come eseguire uno SQL LIKE% query per un singolo valore in questo modo:SQL LIKE% all'interno dell'array

SELECT * FROM users WHERE name LIKE %tom%; 

ma come faccio a fare questo se i termini di ricerca per il mio COME proviene da un array? Per esempio, supponiamo di avere un array come questo:

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

Come si esegue il mio SQL LIKE% per cercare le parole nella mia serie come:

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

senza mettere l'intera query all'interno un ciclo foreach o qualcosa

EDIT: ho dimenticato di dire che sto facendo questo in cakePHP all'interno delle condizioni del cakePHP trovare ('tutti') il metodo, in modo che complica le cose un po '.

Grazie

+0

La tua domanda ha almeno 5 voti per il tag [tag: like-operator]. Potrei cortesemente chiedere di suggerire [tag: sql-like] come [sinonimo] (http://stackoverflow.com/tags/like-operator/synonyms)? – Kermit

risposta

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

Edit: codice per CakePHP:

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

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

Leggi su questa roba: http://book.cakephp.org/1.3/en/view/1030/Complex-Find-Conditions

+1

il mio pensiero esattamente. bella risposta! basta fare attenzione quando si dispone di un array vuoto che causerebbe l'errore SQL ... –

+0

Penso che 'OR 0' farebbe proprio bene ...;) –

+0

Questo funzionerà, ma come faccio questo all'interno del cakePHP find ('tutto') funzione (Vedi modifica) – user765368

4

Non è possibile. Dovrà essere un incatenato field like %..% or field like %..% or .... Una clausola where ... in esegue solo le corrispondenze di stringa, senza supporto per i caratteri jolly.

11

In caso di SQL standard, sarebbe:

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

Dato che stai usando MySQL tu può usare RLIKE (a.k.a. REGEXP)

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

'RLIKE' è stata una soluzione assolutamente fantastica per me, grazie! ! ;) –

3

provare a utilizzare REGEXP

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

ho appena preso il codice di 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); 

per la mia auto, ho dovuto modificare perché mi ha restituito un errore SQL. I Postalo per le persone che leggeranno il thread.

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

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

La differenza tra loro riguarda la citazione, il mio mysql DB ha detto che c'è un problema! così ho dovuto scappare da $sql[] = 'name LIKE %'.$word.'%' e ora funziona perfettamente.

0

Blockquote

/** * Implodi una matrice multidimensionale di valori, raggruppamento caratteri quando diverse con blocco "[]". * @param gamma $ array L'array ad implodere * stringa @return L'array implosa */function hoArray2SqlLike ($ array) { if (!is_array ($ array)) restituisce $ 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

In questo codice non possiamo ottenere le doppie virgolette nella query 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 . 

Oppure si può anche utilizzare valori separati da virgole: -

$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 query sql come questa: -

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