我有2个具有不同数据库和服务器的表。服务器1中的表1包含destination
和invoice no
列,服务器2中的表2包含Invoice No
和Total
列。
我需要总结所有total
中的destination
。两个表的唯一匹配值为invoice no
,其中WS10001
= 10001
。我正在做的方法是select
来自服务器1和表1的所有值,使用foreach
循环这些值并在服务器2的表2中运行查询以总结{{1 }}。
total
当我使用示例表运行带有100条记录的方法时,此方法非常快速,但是当我将其应用于具有10000条以上记录的实际表时,它要运行数小时才能完成,因为它必须运行查询每个foreach循环。
有什么方法可以缩短完成时间,或者我可以保存两个表中的所有值,并用php总结吗?
答案 0 :(得分:0)
您可以使用GROUP BY和SUM来获得每个目的地的总和:
SELECT SUM(total) as total
FROM table2
WHERE destination IN ('Washington','Hawaii','Budapest')
AND invoice_no LIKE '%$invno%'
GROUP BY destination
通过这种方式,数据库无需记住整个数据集,只需记住合计的总和即可,在这种情况下,最多可以得到3个结果(这不是100%的准确度,但现在足够了)。
您还有IN()可以进一步减少数据集,IN()比LIKE快很多。
如果您没有在“目的地”(或另一列中具有各种不同值的列,这些列中您在查询中使用很多值)的索引:在其上添加索引。这样可以缩短查找时间。
答案 1 :(得分:0)
也许只使用2个查询!
$sql ="select * from table1 group by destination";
$result=mysql_query($sql) or die(mysql_error());
// Create an empty query
$sql = "";
while($myrow=MySQL_fetch_array($result,MYSQL_ASSOC))
{
extract($myrow);
$invno=$myrow[2];
// Now you add each query to you "global" query : don't forget the ';' at the end
sql2 .= "select total from table2 where invoice_no like '%$invno%';";
}
现在,您只需使用mysqli_multi_query
(documentation)一次运行此查询,并使用mysqli_next_result
(documentation)获得每个结果。
很抱歉,我无法编写使用PDO的代码,但逻辑是:
1 /您使用所有子查询创建一个“大查询”
2 /您执行此“大查询”
3 /您像以前一样获取所有结果并进行“算术”
4 /然后测试是否有next_result
5 /您获取下一组结果并执行“算术”
6 /重复第4步和第5步,直到不再有next_resut
尝试一下,但是比对每个循环执行一个查询要好!
希望很清楚吗?