2013-03-12 39 views
0

我一直在搜索互聯網和這個論壇,但我仍然無法找出一個好辦法來做到這一點,特別是沒有遇到內存使用問題。這裏去我的任務:Php PDO循環資源而不是抓取

我在傳統的MySQL的所作所爲:

我有3個表,讓說:表1,表2和表3 讓我們假設table1中有300.000行(他們是購買物品,例如) 讓我們假設表2是產品的列表,並有10.000行 讓我們假設表3是服務列表中,用同樣10.000排

現在,我需要做的是生成一份報告,列出每個購買一個循環,它將檢查購買物品是用於產品還是服務,如果它是產品,它將輸出產品的名稱通過獲取table2上的記者姓名列。同樣會發生,如果它是一項服務...

1)在手冊和論壇中說,我不能在沒有完成閱讀我所有的行在PDO運行另一個查詢......這是我需要的情況下運行另一個查詢以獲取產品/服​​務的名稱。 (在mysql中,這很簡單,因爲我可以處理許多結果資源,只需在mysql_result之間迭代它們)

2)有些人說使用fetchall甚至fetch會導致我的內存使用量爆炸,我無法做到這個查詢....我已經嘗試得到一個數組與所有的結果(300K),它象徵性地爆炸我的服務器的內存使用...

所以,你們可以幫助我嗎?我想我的服務器遷移到Windows Azure和他們只允許PDO OS SQLSRV .....

好一些人已經在這裏問我去理論代碼:

// connect to mysql database 
$sql = @mysql_connect("{server}","{login}","{password}"); 
@mysql_select_db("{database}"); 

// query: 
$result = mysql_query("SELECT * FROM table1 ORDER BY purchase_date ASC"); 

for($i=0;$i<$num;$i++){ 

    if(mysql_result($result,$i,"purchase_type")==1){ 

     $result1 = mysql_query("SELECT product_name FROM table2 WHERE id='".mysql_result($result,$i,"purchase_type_id")."'");  
     $name = mysql_result($result1,0,"product_name"); 

    }else if(mysql_result($result,$i,"purchase_type")==2){ 

     $result1 = mysql_query("SELECT service_name FROM table3 WHERE id='".mysql_result($result,$i,"purchase_type_id")."'"); 
     $name = mysql_result($result1,0,"service_name"); 

    }else{ 

     $name = '{error}'; 
    } 

    echo(($i+1)". ".$name." <br/>"); 

} 

PS:這只是一個示例代碼....真正的代碼是比這更長,更復雜....但如果我能解決這裏的理論,我可以找出其餘的... :)

PS2:之前有人問....表2和表3有不同的列....

謝謝,

+0

發佈您的代碼和查詢,這將使它更容易爲我們解答。 – michi 2013-03-12 19:25:07

+2

發佈表格的結構。如果他們之間有適當的設計關係,你應該可以使用'JOIN'並且只需要一個查詢/結果集就可以獲得所有你需要的信息。 – lafor 2013-03-12 19:29:19

+0

應該在數據庫中完成表間連接值,而不是在腳本中完成。保持打包併發送查詢將會非常緩慢。讓你的查詢做類似的事情是微不足道的:case when type ='service'then service.name else product.name end as itemname – kainaw 2013-03-12 19:33:22

回答

2
SELECT 
    table1.*, 
    COALESCE(table2.product_name, table3.service_name, '{error}') as name 
FROM table1 
LEFT JOIN table2 
    ON table1.purchase_type = 1 
    AND table2.id = table1.purchase_type_id 
LEFT JOIN table3 
    ON table1.purchase_type = 2 
    AND table3.id = table1.purchase_type_id 
ORDER BY table1.purchase_date 

請注意,通過讓purchase_type_id引用table2或table3,您會錯過外鍵的一些優點。

+0

OMG ...這很美... – jdstankosky 2013-03-12 20:30:00

+0

OMG ....它是美麗的x2 – user1235861 2013-03-12 22:32:16

0

你可以嘗試這樣的事情(希望它的作品,我做起來,我就跟着去了):

<?php 
// connect to SQLserv database with PDO 
$db = new PDO("sqlsrv:server=yourServer; Database=yourDB", "user", "password"); 

$statement = $db->prepare("SELECT * FROM table1 ORDER BY purchase_date ASC"); 
$statement->execute(); 
$main_result = $statement->fetchAll(PDO::FETCH_ASSOC); 
$statement->closeCursor(); 
unset($statement); 

$p_type1 = array(); 
$p_type2 = array(); 

foreach ($main_result as $row => $column) { 
    switch ($column["purchase_type"]) { 
     case 1: 
      $p_type1[] = $column["purchase_type_id"]; 
      break; 
     case 2: 
      $p_type2[] = $column["purchase_type_id"]; 
      break; 
    } 
} 

$names = array(); 

$statement = $db->prepare("SELECT product_name FROM table2 WHERE id = :id"); 
foreach ($p_type1 as $value) { 
    $statement->execute(":id" => $value); 
    $result = $statement->fetchAll(PDO::FETCH_ASSOC); 
    $statement->closeCursor(); 
    $names[] = $result[0]["product_name"]; 
} 
unset($statement); 
$statement = $db->prepare("SELECT service_name FROM table3 WHERE id = :id"); 
foreach ($p_type2 as $value) { 
    $statement->execute(":id" => $value); 
    $result = $statement->fetchAll(PDO::FETCH_ASSOC); 
    $statement->closeCursor(); 
    $names[] = $result[0]["service_name"]; 
} 

foreach ($names as $key => $value) { 
    echo "$key. $value<br />\n"; 
} 
?>