0

コードに問題があります。これは、データベースに接続するコードであり、一意のデータを選択し、別のテーブルからこれらの一意のデータを合計します。コードに問題はありません。すべて問題ありませんが、クエリに時間がかかります。

<?php
include "koneksi.php";

$no=1;
$arqury=odbc_exec($koneksi, "SELECT DISTINCT NIP_AR,NAMA_AR FROM USRBPS.MASTERFILE");
while($ar=odbc_fetch_array($arqury)){
    $total=0;
    $ambilqury=odbc_exec($koneksi, "SELECT NPWP FROM USRBPS.MASTERFILE WHERE NIP_AR='$ar[NIP_AR]'");
    while($ambil=odbc_fetch_array($ambilqury)){
        $testqury=mysql_query("SELECT SUM(jumlah_bayar) as PENERIMAAN FROM mpnruteng WHERE npwp='$ambil[NPWP]'");
        $test=mysql_fetch_array($testqury);
        $total += $test[PENERIMAAN];
    }

    if($ar[NIP_AR]==""){
        echo "<tr><td>$no</td><td colspan=2>UNASSIGN</td><td>$total</td>";
    }
    else{
        echo "<tr><td>$no</td><td>$ar[NAMA_AR]</td><td>$ar[NIP_AR]</td><td>$total</td></tr>";
    }
    $no++;
}

?>

単にこのようになっているだけで、

|Name   |num_se
---------------
|andre  |1111
|john   |2222
|simon  |3333
|andre  |4444
|andre  |5555
|simon  |6666
|john   |7777


|num_se |Total
---------------
|1111   |12
|2222   |15
|3333   |10
|4444   |8
|5555   |20
|6666   |18
|7777   |22

だから、私が必要とするのは、各「名前」から「合計」の合計を取得することです。私が取得したいのは、num_se から取得した「Total」の各合計を含む「Uniquely」という名前 (この例では Andre、John、Simon) のリストです。

私の英語が下手で申し訳ありませんが、理解していただければ幸いです。

4

4 に答える 4

1

私が正しく理解していれば、このクエリが役立つかもしれません

SELECT t1.Name, sum(t2.Total) 
FROM (table1 t1 LEFT JOIN table2 t2 ON t1.num_se = t2.num_se)
GROUP BY t1.Name

ケースに基づいて、テーブル名と列名を変更します。

アップデート

2 つの別々のデータ ソースを使用する理由がわかりません。ただし、このアプローチにより、コードの効率が向上すると思います。

まず、次のクエリを使用num_seして、それぞれに属するすべてのリストを取得します。name

"SELECT Name, GROUP_CONCAT(num_se) as nums FROM table1 GROUP BY Name"

結果の配列 ('$ar') には"1111,2222"、キーを持つこのような要素が含まれますnums

次に、このクエリを使用して、それぞれの合計を取得しますname

"SELECT SUM(Total) as total FROM Table2 WHERE num_se IN (" . $ar['nums'] . ")"

そして、2 番目のループを必要とせずにtotalfor eachを取得します。name

クエリが安全であることを確認するために、エスケープ手法を使用することを忘れないでください。

于 2013-04-17T07:43:27.587 に答える
0

Windows を使用している場合、127.0.0.1 の代わりに localhost を使用すると、データベースへの接続が遅くなることに気付きました。

于 2013-04-17T07:40:54.530 に答える
0

解決策を提供する前に、クエリが遅すぎる理由を共有したいと思いました。コードを注意深く見ると、最初のクエリ結果でリーチ レコードのデータベース接続を開いています。主なコストは、データベースに対してクエリを開いて実行することです。最初の結果に 1000 件のレコードがある場合、データベース接続を 1000 回開くと想像してください。これにより、非常に遅くなります。Trung で述べられているように、内部結合またはサブクエリを使用します。または、ストアド プロシージャを使用してロジックを SP 内に配置することができない場合は、パフォーマンスを向上させるのにも役立ちます。ストアド プロシージャを作成し、入力パラメータをカンマ区切りの ID として渡します。 ID を分離してループし、select ステートメントを実行します。これを行うには、一時テーブルを使用できます。

于 2013-04-17T07:50:32.687 に答える