1

Perl を使用して MySQL データベースにクエリを実行しようとしています。私のデータベースには、主キーが 3 つの列 PK1、PK2、および PK3 の複合であるテーブルがあります。それぞれ PK1 と PK2 のいくつかの値を含む配列 arr1 と arr2 があります。arr1 と arr2 のすべての可能な組み合わせについて、データベース内の対応する PK3 の値を見つけたいと考えています (PK3 の値がない組み合わせもあるかもしれません)。例えば:

PK1 PK2 PK3
"JIM"   "RED"   1
"JOHN"  "BLUE"  2
"ANN"   "GREEN" 3
"ANN"   "WHITE" 4
"ME"    "BLACK" 5
"ME"    "RED"   6

arr1 = ("JIM", "ME", "ANN")
arr2 = ("BLACK", "RED")

結果が得られるはずです:

arr3 = (1, 5, 6)

私が思いついた最善の解決策は次のとおりです。

foreach my $el1 (@arr1) {
    $i = 0;
    $query = "SELECT PK3 FROM table WHERE PK1 = $el1 AND PK2 = ?;";
    foreach my $el2 (@arr2) {
        my $query_handle = $connxn->prepare($query);
        $query_handle->execute($el2);
        $query_handle->bind_columns(undef, \$rec);
        while($query_handle->fetch()) {
            push(@arr3, $rec); 
        }
    }
}

しかし、バインドするものが何もない $el1 と $el2 の組み合わせがあるため、これは機能しません。これを行うためのより良い/より速い方法はありますか? 大きなテーブルと配列も長いので、エラーが発生しなくてもプログラムに時間がかかります。私はここでアイデアがありませんので、どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

5

必要なクエリは次のとおりです。

SELECT PK3 FROM my_table WHERE PK1 IN ('JIM','ME','ANN') AND PK2 IN ('BLACK','RED')

sqlfiddleで参照してください。

それを構築するには:

my $query = sprintf(
  "SELECT PK3 FROM my_table WHERE PK1 IN (%s) AND PK2 IN (%s)",
  join(",", ('?')x@arr1),
  join(",", ('?')x@arr2)
);
my $query_handle = $connxn->prepare($query);
$query_handle->execute((@arr1, @arr2));
于 2012-06-03T08:28:27.443 に答える