2つのテーブルに対する問い合わせを、一つのクエリで行うのに INNER JOINは重宝します。
でも恥ずかしながら、今のいままで LEFT(RIGHT) JOINの存在を知りませんでした。
LEFT JOIN は、左側のテーブルへの問い合わせ結果に、右側のテーブルへの問い合わせ結果を結合するものです。
INNER JOINでは、ON条件のカラムに両方とも値が入ってなければ、その行は出力されませんでしたが、LEFT JOINなら右側のテーブルのカラムが空でも出力されます(すごい粗い説明ですが、正確にはマニュアルを確認してください)。
クエリの発行が一度で済めば、それだけ処理が高速化できます。
もう一つ困っていたのが、2次元配列を foreach で回しての列の追加です。
$rows1 = DBTbl::getRows($dbh, 'Table1');
if ($rows1) {
$data = array();
foreach ($rows1 as $row1) {
$row2 = DBTbl::getRow($dbh, 'Table2', 'CCI = "'.$row1["Idx"].'"');
if ($row2) {
$row1 = array_merge($row1, $row2);
$row1["AddCol"] = "AddData";
}
$data[] = $row1;
}
}
上の例では、LEFT JOINを使わずにクエリを2回発行しています。 どうしてもそうせざるを得ない場合もあるかもしれません。
array_merge()は、$row1と$row2という1次元の配列を一本につなげて、$row1に代入しています。
その$row1に、"AddCol"というキーで連想配列を追加しています。 そして$dataに1行ずつ追加して、2次元配列に戻しています。
もっと効率の良い方法があると思うんですが、素人なのでこんなレベルです。
なんでこんなことをしているかというと、Smartyのテンプレートに渡す配列をなるべく少なくしたいのですね。