我有一个包含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 将无效,因为这些比较运算符不按数组索引的顺序排列。
任何想法都将不胜感激。我试过搜索很多地方寻找解决方案但找不到任何东西。这种类型的查询可能被称为某种东西,所以也许这就是为什么我什么都没找到。
答案 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 。当你一遍又一遍地运行同一个查询时,查询将在第一次执行时被编译,我们可以多次绑定这些值。