3

我正在使用 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 语句。

如何选择第 1 列的值等于数组的键和第 2 列的值分别小于数组值的第 3 列值?也许以某种方式使用带有两个选择的 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 中做到这一点?

4

1 回答 1

3

我认为这不能用占位符来完成,因为查询的结构不是固定的——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);
于 2012-08-30T23:23:09.653 回答