我有一个数组$arr,长度不定,其取值可能为$arr=(1,5,7);也可能为$arr=(2,8,7,6,3,9)等等。
我有一sql语句为:select * from table where bianhao in $arr;
其中bianhao为表中一个字段,是编号。用in 的话速度较慢。我怎么才能在所有的情况下写成如下形式:
select * from table where bianhao = 1 or bianhao = 5 or bianhao = 7;
select * from table where bianhao = 2 or bianhao = 8 or bianhao = 7 or bianhao = 6 or bianhao = 3 or bianhao = 9;

解决方案 »

  1.   

    in是最常用的写法.
    in不一定比or的写法慢.
      

  2.   

    支持!如果用or的话,可以用循环实现,$arr变成数组,然后foreach循环,将sql语句,$sql .= " or bianhao={$value}";
      

  3.   

    貌似in 和 or 都有可能导致索引失效..$arr = array(1,5,7);
    $arr2 = array(2,8,7,6,3,9);function bianhao($arr,$keyName='bianhao')
    {
    if(!count($arr)) return;
    return implode(' OR ',array_map(create_function('$i','return "'.$keyName.'=\'$i\'";'),$arr));
    }
    echo bianhao($arr);
    echo "<br/>";
    echo bianhao($arr2);
      

  4.   

    用in后的数据集内为为常量时,二分法执行速度很快
    手册上写的
    你的in后的(1,2,3)均为常量
      

  5.   

    写or 跟in 效率都是差不多的
    要是in的可选项较少的话 速度方面应该不会有很大影响
      

  6.   

    bianhao  字段上有没有创建索引?
      

  7.   

    用or可能会好一些,因为日后如果你要匹配的是1,5,7这三个而不是其中一个,用or改写会简单一些。
      

  8.   

    个人觉的 in  跟or 没啥差别. 
    如果你一定要用or 的话,代码这样写 就可以了。
    $where = ' where bianhao = '.implode(' or bianhao = ', $arr);
    $sql = 'select * from table '.$where;这样就OK了