0

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

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

我有 3 个表,假设:table1、table2 和 table3 假设 table1 有 300.000 行(例如,它们是购买项目)让我们假设 table2 是产品列表,并且有 10.000 行让我们假设表 3 是服务列表,也有 10.000 行

现在,我需要做的是生成一个报告,列出循环中的每次购买,这将检查购买的项目是用于产品还是服务,如果是产品,它将通过获取输出产品名称表 2 上的通讯员姓名列。如果它是一项服务,也会发生同样的情况......

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 有不同的列......

谢谢,

4

2 回答 2

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 您会错过外键的一些优势。

于 2013-03-12T20:24:44.170 回答
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";
}
?>
于 2013-03-12T20:28:12.967 回答