我试图通过Perl查询MySQL数据库。我的数据库有一个主键为的表 三列PK1,PK2和PK3的复合物。我有数组arr1和arr2,其中包含一些值 分别为PK1和PK2。我想在数据库中找到每个PK3的相应值 arr1和arr2的可能组合(可能存在一些没有价值的组合 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的组合 无所事事。有没有更好/更快的方法呢?它是一个大桌子和阵列 也很长,所以即使它没有给我一个错误,我的程序也需要时间。我在这里没有想法, 所以任何帮助将不胜感激。谢谢!
答案 0 :(得分: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));