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++;
}

?>

on简直就是这样,

|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 获得的“总”的每个总和。

对不起,我的英语不好,但我希望你能理解。

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

根据您的情况修改表名和列名。

更新

我不知道你为什么使用两个分开的数据源。但是,我认为这种方法会提高代码的效率。

首先,通过此查询获取所有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'] . ")"

您将获得totalfor eachname而无需第二个循环。

请记住使用转义技术来确保您的查询是安全的。

于 2013-04-17T07:43:27.587 回答
1

解释一下您正在针对两个单独的数据源工作是相关的。

这很慢,因为您试图在 PHP 中遍历您的结果集,调用单个查询以从另一个表返回单行,这是非常低效的。

让数据库使用 a 来处理两个相关表之间的关系JOIN,然后让它处理总计的聚合,而不仅仅是单个总计。

以下查询将获得每对不同的 nip_ar 和 nama_ar 的总数:

SELECT 
  t1.NIP_AR,
  t1.NAMA_AR,
  SUM(t2.jumlah_bayar) as PENERIMAAN

FROM 
  USRBPS.MASTERFILE t1

  INNER JOIN mpnruteng t2
  ON t2.npwp = t1.npwp

GROUP BY
  1, 2

但无论如何,你要把它卷成一个盛大的$total,所以这将为你得到:

SELECT 
  SUM(PENERIMAAN) as PENERIMAAN

FROM 
  (
     SELECT 
       t1.NIP_AR,
       t1.NAMA_AR,
       SUM(t2.jumlah_bayar) as PENERIMAAN

     FROM 
       USRBPS.MASTERFILE t1

       INNER JOIN mpnruteng t2
       ON t2.npwp = t1.npwp

     GROUP BY
       1, 2
  )

您可以从 Oracles 服务器配置到您的 mySql 服务器的链接。请参阅使用异构服务代理 - 第 4 章。设置对非 Oracle 系统的访问。我的理解是你不能从 mySql 链接到 Oracle。

这将允许您在 Oracle 实例上运行上述查询。尽管您需要更新表名以使用数据源名称完全限定它们。

于 2013-04-17T08:01:45.460 回答
0

如果您使用的是 Windows,我注意到使用 localhost 而不是 127.0.0.1 会减慢与数据库的连接速度。

于 2013-04-17T07:40:54.530 回答
0

在给出任何解决方案之前,我想分享一下您的查询太慢的原因。如果您仔细查看您的代码,您正在为第一个查询结果中的到达记录打开数据库连接。主要成本是打开和运行对数据库的查询。所以想象一下,如果您在第一个结果中有 1000 条记录,您将打开数据库连接 1000 次,这将使其非常缓慢。使用 Trung 所述的内部联接或子查询。或者,如果无法使用存储过程并将逻辑放在 SP 中也将帮助您获得性能。创建一个存储过程并将输入参数作为逗号分隔的 Ids 传递给您从另一个数据库获得的内容,在 SP 内部使用逗号将 ID 分隔到任一循环并执行 select 语句。您可以使用临时表来执行此操作。

于 2013-04-17T07:50:32.687 回答