Php PDO循环资源而不是获取

时间:2013-03-12 19:19:32

标签: php mysql azure pdo

我一直在搜索互联网和这个论坛,但我仍然无法找到一个快速做到这一点的好方法,特别是没有遇到内存使用问题。这是我的任务:

我在传统的mysql中做了什么:

我有3个表,比方说:table1,table2和table3 我们假设table1有300.000行(例如,它们是购买项) 我们假设table2是产品列表,并且有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:在有人要求之前...... table2和table3有不同的列......

谢谢,

2 个答案:

答案 0 :(得分: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,您会错过外键的一些优点。

答案 1 :(得分: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";
}
?>