wake-up-neo.com

SQL LIKE% innerhalb des Arrays

Ich weiß, wie eine SQL-LIKE-Abfrage für einen einzelnen Wert ausgeführt wird:

SELECT * FROM users WHERE name LIKE %tom%;

aber wie mache ich das, wenn die Suchbegriffe für mein LIKE aus einem Array stammen? Angenommen, wir haben ein Array wie dieses:

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

Wie führe ich mein SQL LIKE% aus, um nach den Wörtern in meinem Array zu suchen, wie:

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

OHNE die gesamte Abfrage in eine foreach-Schleife oder etwas hineinstellen

EDIT: Ich habe vergessen zu erwähnen, dass ich dies in cakePHP innerhalb der Bedingungen der cakePHP find ('all') -Methode mache, so dass die Sache ein wenig kompliziert wird.

Vielen Dank

20
user765368
$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: Code für CakePHP:

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

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

Lesen Sie sich dies durch: http://book.cakephp.org/1.3/de/view/1030/Complex-Find-Conditions

28
472084

Im Falle von Standard-SQL wäre dies: 

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

Da Sie MySQL verwenden, können Sie RLIKE (a.k.a. REGEXP) verwenden.

SELECT * FROM users WHERE name RLIKE 'tom|smith|larry';
13
vartec

Du kannst nicht Es muss ein verketteter field like %..% or field like %..% or ... sein. Eine where ... in-Klausel extrahiert nur Übereinstimmungen mit Zeichenfolgen, ohne Platzhalterzeichen.

4
Marc B

versuchen Sie es mit REGEXP

SELECT * FROM users where fieldName REGEXP 'Tom|Smith|Larry';
3
John Woo

Blockquote

/** * Implodieren Sie ein mehrdimensionales Array von Werten, gruppieren Sie Zeichen, wenn sie mit dem Block "[]" unterschiedlich sind. * @param array $ array Das zu implodierende Array * @return string Das implodierte Array */ Funktion hoArray2SqlLike ($ array) { if (! is_array ($ array)) gibt $ array zurück;

$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 diesem Code können wir keine doppelten Anführungszeichen in SQL-Abfrage erhalten

$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 .

Oder Sie können auch einen durch Kommas getrennten Wert verwenden: -

$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-SQL-Abfrage wie folgt: -

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

ich habe gerade den Code 472084 genommen. 

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

Für mich selbst musste ich es ändern, da es mir einen Fehler SQL gab. Ich poste es für Leute, die den Thread lesen werden.

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

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

Der Unterschied zwischen ihnen ist über Zitat, mein mysql DB sagte, es gibt ein Problem! Also musste ich Zitat von $sql[] = 'name LIKE %'.$Word.'%' entkommen und jetzt funktioniert es perfekt.

0
user3114471