0

私はインターネットとこのフォーラムを検索してきましたが、メモリ使用量の問題に遭遇することなく、特に高速に実行するための良い方法をまだ見つけられません。ここに私の仕事があります:

従来の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 は異なる列を持っています....

ありがとう、

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_idtable2または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 に答える