我使用的是php+mysql,DB中有这样的表:
col1-col2-col3
A - val1 - str1
A - val2 - str2
A - val3 - str3
B - val4 - str4
B - val5 - str5
...
还有php中的assoc数组:
$arr = array('A'=>'value1','B'=>'value2', ...);
然后,我在MySql字符串的占位符中传递这个数组,以生成完整的SELECT语句。
如何选择第3列的值,其中第1列的值等于数组的键,第2列的值分别小于数组的值?也许以某种方式使用GROUP和两个选择并将它们连接在一起。。。
结果应该只是满足要求的所有列3值的列表。
它可以用这样的东西来完成:
$aReturn = array();
$sql = "SELECT col3 FROM MyTab WHERE col1 = ? AND col2 < ?d";
foreach ($arr as $k=>$v) {
$aReturn = array_merge($aReturn, $this->select($sql, $k, $v));
}
其中select是对DB进行选择并返回值列表中最后一列的值的方法,然后我们将列表添加到结果$aReturn中。但在这种情况下,它将查询几次,但是有没有办法只在一个SELECT中执行?
我认为这不能用占位符完成,因为查询的结构不是固定的——WHERE子句中需要的条件与数组中的元素一样多。这是未经测试的代码:
更新:使用准备好的语句
$wheres = array();
$types = '';
$col1s = array();
$params = array(null, null);
$i = 0;
foreach ($assoc as $key => $val) {
$wheres[] = '(col1 = ? AND col2 < ?)';
$types .= 'ss';
$col1s[$i] = $key;
$params[] = &$col1s[$i];
$params[] = &$assoc[$key];
$i++;
}
$whereclause = implode(' OR ', $wheres);
$sql = "SELECT * FROM my_table WHERE $whereclause";
$stmt = mysqli_prepare($link, $sql);
$params[0] = $stmt;
$params[1] = $types;
call_user_func_array('mysqli_stmt_bind_params', $params);
mysqli_stmt_execute($stmt);