【问题标题】:Optimise querying the sums of values for several keys in PHP优化查询PHP中多个键的值总和
【发布时间】:2018-11-09 09:33:15
【问题描述】:

我在 Postgres 中有一个带有 SIP 日志的表。

|   in    |       out      |   sec   |
|   112   | sip/113-random |    12   | 
|   113   | sip/112-random |    45   | 
|   112   | sip/114-random |    40   | 
|   113   | sip/114-random |    35   | 
|   117   | sip/113-random |    11   | 
|   117   | sip/113-random |    25   | 
|   115   | sip/112-random |    98   | 
|   115   | sip/117-random |    78   | 
|   112   | sip/113-random |    18   | 

我需要将“输入”和“输出”中的所有sec 与单个 SIP 相加,并按 SIP 号码分组。

例子:

....
112 - 54
113 - 152
115 - 25
....

现在我使用此代码。但它是循环运行的,需要很长时间。

$array_sip=array(110,111 ....  199);

foreach ($array_sip as $sip) {
    $sum_out=0;
    $sum_in=0;
    $sql = "SELECT  SUM(sec) AS sec 
            FROM public.cdr 
            WHERE calldate::text like '".$date."%'  
            AND disposition='ANSWERED'
            AND out like 'SIP/".$sip."%'
            AND sec > 15
            ";  
            foreach ($db->query($sql) as $row) {
                $sum_out=$row['sec'];
            }
    $sql = "SELECT  SUM(sec) AS sec 
            FROM public.cdr 
            WHERE calldate::text like '".$date."%'  
            AND disposition='ANSWERED'
            AND in = '".$sip."'
            AND sec > 3";   

            foreach ($db->query($sql) as $row) {
                $sum_in=$row['sec'];
            }
    $sum=round((($sum_out+$sum_in)/60),1);
    $loading_level.= $sip.' - '.$sum;
}

如何优化查询?

【问题讨论】:

  • PostgreSQL MySQL。请相应地标记问题(不要标记垃圾邮件)。

标签: php postgresql sqlperformance


【解决方案1】:

您应该编写并运行这样的查询:

SELECT substring(out FROM '\d+'),
       SUM(sec) AS sec
FROM public.cdr
WHERE calldate::text LIKE '<your date>%'
AND disposition = 'ANSWERED'
AND out LIKE ANY ('SIP/<sip1>-%', 'SIP/<sip2>-%', ...)
AND sec > 15
GROUP BY substring(out FROM '\d+');

您必须将上面的 &lt;...&gt; 替换为您的实际值。

LIKE ANY 条件将传递与其中一种模式匹配的所有内容。

这样您可以在一个查询中获取所有信息,效率更高。

calldate::textout 上的索引可能会加快处理速度。

【讨论】:

  • 我在没有 SIP 的情况下得到了这个 Array ( [substring] => [0] => [sec] => 3143 [1] => 3143 ) Array ( [substring] => d [0] = > d [sec] => 1395 [1] => 1395 ) 你的查询没有“in”求和
  • 也许您的out 看起来与您展示的不同?您可能需要不同的模式。
  • 是否可以制作没有循环的代码?能够计算按 SIP 分组的“秒”量
  • 您需要一个循环来构造查询。但是,您只需一个查询即可获得全部答案。
猜你喜欢
  • 2013-02-17
  • 2013-06-28
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 2015-05-07
  • 2011-06-12
  • 2022-01-23
  • 2016-06-02
相关资源
最近更新 更多