2013-03-12 2 views
0

Я искал в Интернете и этот форум, но я до сих пор не могу найти хороший способ сделать это FAST и, особенно, без проблем с использованием памяти. Вот идет моя задача:Php PDO loop ресурс вместо fetch

То, что я сделал в традиционном MySQL:

У меня есть 3 таблицы, позволяет сказать: table1, table2 и Таблица3 Давайте предположим, что table1 имеет 300.000 строк (они закупите детали, например,) Давайте предположим, что table2 список продуктов, и имеет 10000 строк предположим, что таблица 3 представляет списки услуг, с также 10,000 строк

Теперь, что мне нужно сделать, это создать отчет с перечислением каждую покупку в цикл, который будет проверять, является ли элемент покупки для продукта или услуги, и если это продукт, он выведет название продукта ct, получив столбец соответствующего имени в таблице2. То же самое произойдет, если это услуга ...

1) В руководствах и форумах сказано, что я не могу запускать другой запрос в PDO, не заканчивая чтение всех моих строк ... что в этом случае, поскольку мне нужно запустите другой запрос, чтобы получить имя продукта/услуги. (В mysql это довольно просто, так как я могу обрабатывать множество ресурсов результата и просто перебирать между ними с помощью mysql_result)

2) Некоторые люди говорили, что использование fetchall или even fetch приведет к взрыву в моем использовании памяти, и я не смогу это сделать этот запрос .... Я уже пытался получить массив со всеми результатами (300K), и он образно взрывает использование памяти моего сервера ...

Итак, ребята, вы можете мне помочь? Я пытаюсь пошевелить серверы в Windows Azure, и они только позволяют PDO Os SQLSRV .....

Ok некоторые люди спрашивают здесь идет мой теоретический код:

// 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 имеют разные столбцы ....

Thanks,

+0

разместить свой код и запросы, это облегчит нам ответить. – michi

+2

Опубликуйте структуру своих таблиц. Если между ними есть правильно спроектированные отношения, вы должны иметь возможность использовать 'JOIN' и получать всю необходимую информацию только в одном наборе запросов/результатов. – lafor

+0

Объединение значений между таблицами должно выполняться в базе данных, а не в скрипте. Будет очень медленно поддерживать упаковку и отправлять запросы. Тривиально, чтобы ваш запрос делал что-то вроде: case, когда type = 'service' then service.name else product.name end as itemname – kainaw

ответ

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, обратитесь к таблице2 или таблице3, вы пропустите некоторые преимущества от внешних ключей.

+0

OMG ... Это красиво ... – jdstankosky

+0

OMG .... это битое x2 – user1235861

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"; 
} 
?> 
Смежные вопросы