SQL LIKE% внутри массива
Я знаю, как выполнить запрос 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 или чего-то
EDIT. Я забыл упомянуть, что я делаю это в cakePHP в условиях метода find ('all') cakePHP, так что это немного усложняет ситуацию.
Спасибо
Ответы
Ответ 1
$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
Ответ 2
В случае стандартного 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';
Ответ 3
Вы не можете. Это должно быть цепочка field like %..% or field like %..% or ...
. Предложение where ... in
только извлекает совпадения строк, без поддержки подстановочных знаков.
Ответ 4
попробуйте использовать REGEXP
SELECT * FROM users where fieldName REGEXP 'Tom|Smith|Larry';
Ответ 5
Я просто взял код 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.'%'
и теперь он работает отлично.
Ответ 6
Blockquote
/**
* Имплицируйте многомерный массив значений, группируя символы, когда они отличаются от блока [].
* @param array $array Массив для взлома
* @return string Вмещенный массив
*/
function 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 );
}
Ответ 7
В этом коде мы не можем получить двойные кавычки в 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%';
Ответ 8
Многие системы SQL позволяют использовать его как символьное значение. CHAR (10) = перевод строки. Таким образом, иногда, вместо проработки всей escape-кодировки, вы можете вставить одинарные кавычки, двойные кавычки и другие вещи в строку sql без особых проблем с кодированием.
-Just подсказка.