优化查询 PHP 中多个键值的总和

Optimise querying the sums of values for several keys in PHP

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

|   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   | 

我需要将 "in" 和 "out" 中的所有 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;
}

如何优化查询?

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

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+');

您必须将上面的 <...> 替换为您的实际值。

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

这样就可以一次查询全部搞定,效率会更高

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