使用Perl查找复合主键的一部分

use*_*647 1 mysql perl

我试图通过Perl查询MySQL数据库.我的数据库有一个表,其主键是三列PK1,PK2和PK3的组合.我有数组arr1和arr2,它们分别包含一些PK1和PK2值.我想在数据库中为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")
Run Code Online (Sandbox Code Playgroud)

我应该得到结果:

arr3 = (1, 5, 6)
Run Code Online (Sandbox Code Playgroud)

我能想出的最佳解决方案是:

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); 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为将有$ el1和$ el2的组合,没有任何东西可以绑定.有没有更好/更快的方法呢?它是一个大表,数组也很长,所以即使它没有给我一个错误,我的程序也需要时间.我在这里没有想法,所以任何帮助将不胜感激.谢谢!

egg*_*yal 5

您想要的查询是:

SELECT PK3 FROM my_table WHERE PK1 IN ('JIM','ME','ANN') AND PK2 IN ('BLACK','RED')
Run Code Online (Sandbox Code Playgroud)

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));
Run Code Online (Sandbox Code Playgroud)