2017-01-16 96 views
0

我有一个数据库,每个月都有电话记录,我会根据这个数据向客户开账单。从DB选择并发电话呼叫

记录包含:

ID - Owner - Caller_ID - Calling_To - connect_time - disconnect_time - category 

客户可以拥有多个号码。如果有2条记录的connect_time重叠,那么这是一个并发呼叫。例如:

X1 - Alex - 0099989898 - random number - 01:00:00 - 02:00:00 - international 
X2 - Alex - 0055989898 - random number - 01:30:00 - 01:50:00 - local 
X3 - Alex - 0066666666 - random number - 01:45:00 - 02:00:00 - local 

X1和X2是并发呼叫。

我,我用它来获取过去一个月的记录当前的查询如下:

CallDataRecord::where('owner', 'Alex') 
       ->whereBetween('connect_time', array($beginDate, $endDate)) 
       ->orderBy('connect_time', 'desc') 
       ->get(); 

这很简单,但我还没有从哪里开始可以查询并发呼叫任何成功。

我已经做了一个PHP脚本使用数组和一堆if else语句加上一个函数,例如isDateBetween,我会运行所有从数据库提取的记录在foreach循环,将检查数字/记录是否封装由另一个号码/记录,从而获得并发呼叫。这是非常缓慢的。

我很感激一些指导。谢谢。

+0

我怎么能知道这是同一个客户端的多个号码是多少? – sumit

+0

@sumit对不起。我编辑了桌子。例如,他们有一个“所有者”字段。 – Spacemudd

回答

0

是的,循环返回的PHP结果将非常慢,因为数据不会被索引,这与数据库系统不同。

下面应该返回你正在寻找的数据:

CallDataRecord::where('owner', 'Alex') 
    ->whereBetween('connect_time', array($beginDate, $endDate)) 
    ->where(function ($q) { 
     $q->where('connect_time', '>=', 'connect_time') 
     $q->where('connect_time', '<=', 'disconnect_time') 
    }) 
    ->orWhere(function ($q) { 
     $q->where('disconnect_time', '>=', 'connect_time') 
     $q->where('disconnect_time', '<=', 'disconnect_time') 
    }) 
    ->orderBy('connect_time', 'desc') 
    ->get();