MySQL:如何创建在数组索引上使用数组变量执行的查询?

时间:2011-05-27 04:49:49

标签: php mysql arrays indexing

我有一个包含3个变量的查询,我一遍又一遍地运行。如何创建一个接受值数组的查询,以便我可以运行一次查询并在一个结果中获取所有数据?这是一个例子:

  • SELECT * FROM table WHERE column 1 = 3 AND column 2 != 35 AND column 3 > 10
  • SELECT * FROM table WHERE column 1 = 9 AND column 2 != 12 AND column 3 > 293
  • SELECT * FROM table WHERE column 1 = 6 AND column 2 != 96 AND column 3 > 39

我需要执行查询以使每个数组的第一个值(索引0)一起运行,然后每个数组的第二个值(索引1)一起运行,依此类推。换句话说,我希望查询使用值[基于上面的例子](3,35,10)然后(9,12,293)等运行。

查询需要独立,这意味着我需要能够通过$ _POST将3个数组传递给远程服务器,该服务器将直接插入查询并在远程服务器上执行。

使用 IN NOT IN 将无效,因为这些比较运算符不按数组索引的顺序排列。

任何想法都将不胜感激。我试过搜索很多地方寻找解决方案但找不到任何东西。这种类型的查询可能被称为某种东西,所以也许这就是为什么我什么都没找到。

4 个答案:

答案 0 :(得分:3)

在php中,您可以按如下方式构建UNION ALL查询:

$vals = array(array(3,35,10), array (9,12,293)) //this can be built from $_POST or wherever

$queryArr = array();
foreach ($vals as $arr)
{
 $queryArr[] = "SELECT * FROM table WHERE column 1 = $arr[0] AND column 2 != $arr[1] AND column 3 > $arr[2]";
}

$query = implode(' UNION ALL ', $queryArr);  //note: if you want to do separate queries, rather than a UNION of them, just use $queryArr

PS:正如他在评论中提到的那样,你应该避免SELECT *并指明字段以便清楚。

答案 1 :(得分:0)

我认为你需要为不同的数组值执行查询....所以你需要有一个接受数组变量的函数,然后执行这个查询中的所有数组项!#。

 function result_table($arr_var){
      $sizeof_arr = sizeof($arr_var);
      if($sizeof_arr == 3){
         foreach ($arr_var as $val)
        {
           $qry_array[] = "SELECT * FROM table WHERE column 1 = $val[0] AND column 2 !=    $val[2] AND column 3 > $val[3]";

           return $qry_array;
        }
      }else{
           echo "Array values number is wrong";
      }

 }

 $arr_val = array((3,35,10), array (9,12,293), array(6, 96, 39));
 $union_qry = result_table($arr_val);

答案 2 :(得分:0)

由于您需要阻止SQL注入,因此您最好使用预准备语句。

如果$_POST包含三元组数组:

# sample data
$_POST = array(array(3,35,10), array(9,12,293), array(6, 96, 39));

# utility functions
function array_flatten_into($source, &$target) {
    foreach ($source as $key => $val) {
        if (is_array($val)) {
            array_flatten_into($val, $target);
        } else {
            $target[] = $val;
        }
    }
    return $target;
}
function array_flatten($arr) {
    $flat = array();
    return array_flatten_into($arr, $flat);
}

# create the query
$statement = 'SELECT ... FROM table WHERE ' 
             . implode(' OR ', 
                       array_fill(0, count($_POST), '(col1 = ? AND col2 != ? AND col3 > ?)'));
$query = $db->prepare($statement);
$query->execute(array_flatten($_POST));

如果$_POST是一个扁平数组:

$_POST = array(3,35,10, 9,12,293, 6, 96, 39);

$statement = 'SELECT ... FROM table WHERE ' 
             . implode(' OR ', 
                       array_fill(0, count($_POST)/3, '(col1 = ? AND col2 != ? AND col3 > ?)'));
$query = $db->prepare($statement);
# call to `array_values` isn't necessary in this particular example, but may be
# in the actual code if $_POST is sparse or has non-integer keys
$query->execute(array_values($_POST));

一旦你有超过1个三元组,性能就会降低,因为MySQL需要运行表扫描。

答案 3 :(得分:0)

我认为你需要看一下准备好的陈述。你可以使用PDO extension 。当你一遍又一遍地运行同一个查询时,查询将在第一次执行时被编译,我们可以多次绑定这些值。