3

私はphp + mysqlを使用しています.DBにそのようなテーブルがあります:

col1-col2-col3
A - val1 - str1
A - val2 - str2
A - val3 - str3
B - val4 - str4
B - val5 - str5
...

また、PHPの連想配列:

$arr = array('A'=>'value1','B'=>'value2', ...);

次に、この配列を MySql 文字列のプレースホルダーに渡して、完全な SELECT ステートメントを作成します。

列 1 の値が配列のキーに等しく、列 2 の値がそれぞれ配列の値より小さい列 3 の値を選択する方法は? たぶん、どういうわけか2つの選択でGROUPを使用して、それらを結合します...

結果は、要件を満たすすべての列 3 の値のリストになります。

次のように sth を使用して実行できます。

$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 に select を作成し、値のリストの最後の列の値を返すメソッドであり、結果の $aReturn に list を追加します。しかし、この場合は複数回クエリを実行することになりますが、 1 回のSELECTだけで実行する方法はありますか?

4

1 に答える 1

3

クエリの構造が固定されていないため、プレースホルダーを使用してこれを行うことはできないと思います。配列内の要素と同じ数の条件が WHERE 句に必要です。テストされていないコードは次のとおりです。

UPDATED: 準備済みステートメントを使用

$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 に答える