SQL LIKE% внутри массива - PullRequest
       9

SQL LIKE% внутри массива

20 голосов
/ 23 февраля 2012

Я знаю, как выполнить запрос SQL LIKE% для одного значения, например:

SELECT * FROM users WHERE name LIKE %tom%;

но как мне это сделать, если условия поиска для моего LIKE взяты из массива? Например, допустим, у нас есть такой массив:

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

Как мне выполнить свой SQL LIKE% для поиска слов в моем массиве, например:

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

БЕЗ помещения всего запроса в цикл foreach или что-то в этом роде

РЕДАКТИРОВАТЬ : Я забыл упомянуть, что я делаю это в cakePHP в условиях метода cakePHP find ('all'), так что это немного усложняет.

Спасибо

Ответы [ 8 ]

28 голосов
/ 23 февраля 2012
$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

14 голосов
/ 23 февраля 2012

В случае стандартного 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';
4 голосов
/ 23 февраля 2012

Вы не можете.Это должно быть приковано field like %..% or field like %..% or ....Предложение where ... in извлекает только совпадения строк без поддержки подстановочных знаков.

3 голосов
/ 23 февраля 2012

попробуйте использовать REGEXP

SELECT * FROM users where fieldName REGEXP 'Tom|Smith|Larry';
0 голосов
/ 18 июня 2019

Многие системы SQL позволяют использовать его как символьное значение. CHAR (10) = перевод строки. Таким образом, иногда, вместо проработки всей escape-кодировки, вы можете вставить одинарные кавычки, двойные кавычки и другие вещи в строку sql без особых проблем с кодированием.

-Просто намек.

0 голосов
/ 24 августа 2016

В этом коде мы не можем получить двойные кавычки в 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.="";}

Echo SQL-запрос, как это: -

SELECT * FROM person where name like '%Tom%' OR name like '%Smith%' OR name like '%Larry%';
0 голосов
/ 23 сентября 2015

Blockquote

/ ** * Внедрить многомерный массив значений, группируя символы, когда они отличаются, с помощью блока «[]» * @param array $ array Массив для взрыва * @return string Развернутый массив * / функция hoArray2SqlLike ($ array) { if (! is_array ($ array)) возвращает $ 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 голосов
/ 18 декабря 2013

Я просто взял код 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 сказала, что есть проблема!поэтому мне пришлось уйти от цитаты из $sql[] = 'name LIKE %'.$word.'%', и теперь она отлично работает.

...