2013-01-18 97 views
0

考慮下面的代碼片段裏面有兩個MySQL的查詢被解僱作爲一個循環的一部分:優化多個MySQL查詢在一個循環與PDO

<?php 
    $requested_names_array = ['ben','john','harry']; 

    $statement_1 = $connection->prepare("SELECT `account_number` FROM `bank_members` WHERE `name` = :name"); 
    $requested_name = ""; 
    $statement_1->bindParam(":name",$requested_name); //$requested_name will keep changing in value in the loop below 

    foreach($requested_names_array as $requested_name){ 
     $execution_1 = $statement_1->execute(); 
     if($execution_1){ 
      //fetch and process results of first successful query 
      $statement_2 = $connection->prepare("SELECT `account_balance` from `account_details` WHERE `account_number` = :fetched_account_number"); 
      $statement_2->bindValue(":fetched_account_number",$fetched_account_number); 
      $execution_2 = $statement_2->execute(); 
      if($execution_2){ 
       //fetch and process results of second successful query, possibly to run a third query 
      } 
     }else{ 
      echo "execution_1 has failed, $statement_2 will never be executed."; 
     } 
    } 
?> 

這裏的問題是,$ statement_2準備時間和時間再次是,而不是僅僅用不同的參數執行。

我不知道在進入循環之前是否也可以準備$ statement_2,所以它只是在循環中更改其參數才執行(而沒有準備好),就像$ statement_1那樣。

在這種情況下,你會最終被先準備幾個語句,他們每個人在下面的循環中執行。

即使這樣做是可能的,也可能效率不高,因爲如果執行其他語句失敗,某些語句將被徒然編寫。

你會如何建議保持這樣的結構優化?

回答

2

你應該重新寫爲聯合:

SELECT account_number, account_balance 
FROM bank_members 
INNER JOIN account_details ON bank_members.account_number = account_details.account_number 

一個單一的查詢,準備一次,執行一次,獲取你需要的所有數據。

+1

只是旁註:INNER JOIN與JOIN – Kyle

+1

@PiontekMedia相同:我傾向於始終顯式指定連接類型。當天晚些時候我可能沒有那麼清醒。 –

+0

哈哈夠公平了,只是想我會指出來。真的只是個人喜好。 – Kyle