从DB中选择并发电话

时间:2017-01-16 10:48:19

标签: sql laravel

我有一个带有电话记录的数据库,每个月,我会根据它向客户收费。

记录包含:

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

客户可能拥有多个号码。如果在任何时候2条记录的connect_time重叠,则它是并发调用。 E.g:

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();

这很简单,但我没有在哪里开始能够查询并发调用方面取得任何成功。

我使用数组和一堆if else语句以及一个函数来制作一个PHP脚本,例如isDateBetween我将在foreach循环中运行数据库中所有获取的记录,以检查数字/记录是否被其他数字/记录封装?,从而获得并发呼叫。这非常慢。

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

1 个答案:

答案 0 :(得分: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();