我一直在搜索互聯網和這個論壇,但我仍然無法找出一個好辦法來做到這一點,特別是沒有遇到內存使用問題。這裏去我的任務: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有不同的列....
謝謝,
發佈您的代碼和查詢,這將使它更容易爲我們解答。 – michi 2013-03-12 19:25:07
發佈表格的結構。如果他們之間有適當的設計關係,你應該可以使用'JOIN'並且只需要一個查詢/結果集就可以獲得所有你需要的信息。 – lafor 2013-03-12 19:29:19
應該在數據庫中完成表間連接值,而不是在腳本中完成。保持打包併發送查詢將會非常緩慢。讓你的查詢做類似的事情是微不足道的:case when type ='service'then service.name else product.name end as itemname – kainaw 2013-03-12 19:33:22