2012-06-03 24 views
1

我想通過Perl查詢MySQL數據庫。我的數據庫有一個表,其主鍵是 由三列PK1,PK2和PK3組成。我有數組arr1和arr2分別包含PK1和PK2的一些值 。我想在每個 arr1和arr2的可能組合中找到數據庫中相應的PK3值(可能有一些組合中沒有PK3的值 )。例如:使用Perl查找複合主鍵的一部分

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的組合,其中 沒有任何約束。有沒有更好/更快的方式來做到這一點?它的一個大表和數組是 也很長,所以即使它沒有給我一個錯誤,我的程序也需要時間。我在這裏沒有想法, 所以任何幫助將不勝感激。謝謝!

回答

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(",", ('?')[email protected]), 
    join(",", ('?')[email protected]) 
); 
my $query_handle = $connxn->prepare($query); 
$query_handle->execute((@arr1, @arr2)); 
+0

謝謝...但我怎麼會寫這'@ arr1'和'@ arr2'方面? – user828647

+0

@ user828647:我的Perl有點生疏,但我認爲上面修改後的答案應該可以做到。 – eggyal

+0

謝謝!有用!但是,你能否向我解釋一下你在'join'中使用的synatax? '('?')x @ arr1'是什麼意思? – user828647

相關問題