数组内的SQL LIKE%

时间:2012-02-23 15:31:13

标签: php mysql sql 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循环中或

编辑:我忘了在cakePHP find('all')方法的条件下在cakePHP中做这个,这样就让事情变得复杂了。

由于

9 个答案:

答案 0 :(得分:28)

$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

答案 1 :(得分:14)

对于标准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';

答案 2 :(得分:4)

你做不到。它必须是一个链式field like %..% or field like %..% or ...where ... in子句仅提取字符串匹配,不支持通配符。

答案 3 :(得分:3)

尝试使用REGEXP

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

答案 4 :(得分:0)

我刚拿了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.'%'的引用 现在它完美无缺。

答案 5 :(得分:0)

  

块引用

/ **  *内嵌一个多维数组值,在与#34; []"不同时对字符进行分组。块。  * @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 );

}

答案 6 :(得分:0)

在此代码中,我们无法在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%';

答案 7 :(得分:0)

许多SQL系统允许您将其作为字符值推送。 CHAR(10)=换行符。因此,有时,您无需计算所有的转义编码,而是可以通过这种方式将单引号,双引号和其他内容推入sql字符串中,而不会出现太多其他编码问题。

-只是一个提示。

答案 8 :(得分:0)

试试这个: 只需多一行代码:)

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

$words = implode("%' OR `name` LIKE '%", $words);
// result -> Tom% OR `name` LIKE %Smith% OR `name` LIKE %Larray

$menus = "SELECT * FROM `users` WHERE `name` LIKE '%" . $words . "%'";
// result -> "... WHERE `name` LIKE %Tom% OR `name` LIKE %Smith% OR `name` LIKE %Larray%";