当我尝试这些查询时,它运行得很慢,因为我有很多数据,但我不能从顶部查询中排除任何更多,因为我需要先查看第二个查询是否导致{0总计{ {1}}和第一个查询中的futureAmts
on_hand
我尝试了$inv = odbc_exec($live,"SELECT * FROM V1ICPR WHERE Account='".$account."'");
while (odbc_fetch_array($inv))
{
$futureOrds = 0;
$checkFuture = odbc_exec($live,"SELECT Order_num FROM V1OEMF WHERE Account = '".$account."' AND Status='Open' AND Ship_date > '".date("Ymd")."'");
while(odbc_fetch_array($checkFuture))
{
$getFutureAmt = odbc_exec($live,"SELECT Amount FROM V1OEOO WHERE bol='".odbc_result($checkFuture,'Order_num')."' AND Prod_code='".odbc_result($inv,'Prod_code')."'");
while (odbc_fetch_array($getFutureAmt)){
$futureOrds = $futureOrds + intval(odbc_result($getFutureAmt,'Amount'));
}
}
,但该查询无法完全运行,我的INNER JOIN查询是否存在问题?是否有更快的方法来编码?
Inner Join
如果我只运行第一个获得产品信息的第一个级别,并且没有关于未来订单的信息,它会在2秒内运行,但是使用这些嵌套查询可能需要30 - 60 +秒
TABLES:
/*
$checkFuture = odbc_exec($live,"SELECT V1OEMF.Order_num, V1OEOO.Amount FROM V1OEMF INNER JOIN V1OEOO ON V1OEMF.Order_num = V1OEOO.bol WHERE V1OEMF.Account = '".$account."' AND V1OEMF.Status='Open' AND V1OEMF.Ship_date > '".date("Ymd")."' AND V1OEOO.Prod_code='".odbc_result($inv,'Prod_code')."'")
while(odbc_fetch_array($checkFuture))
{
$futureOrds = $futureOrds + intval(odbc_result($checkFuture,'Amount'));
}
*/
答案 0 :(得分:1)
此解决方案已在评论中得到解决,但我将其添加为未来读者的利益答案。
您需要在WHERE
子句的每个列上添加索引。如果你说拥有大量数据,这将大大提高每个查询的速度。您可以使用ALTER TABLE
命令执行此操作。
此外,只要您期望只有一个结果,尤其是在内部循环中,请使用TOP 1
(对于MSSQL,对于MySQL为LIMIT 1
)。