MySQL匹配来自两个表的电话

时间:2013-07-02 15:01:03

标签: mysql match

我一直在努力解决一个看似简单的问题,现在几天,无论我采取哪种尝试,我都无法完美地理解它。

我有两个简单的表,每个表有3个列:call_date,call_time,caller_id,所有这些都是不言自明的。

第一个表包含入站呼叫,第二个表包含出站呼叫。

收到呼入电话后,应在30分钟内拨打相应的外拨电话。到目前为止这么好,这里没有问题,但这是一个有点棘手的地方:

  1. 入站表中的同一个caller_id可以有多个入站呼叫。
  2. 只有与上次相关通话至少相隔30分钟的通话才会被视为有效通话。所以当有人打电话四次时,比如说08:00,08:15,88:31和09:31,有三个有效的电话:08:00,08:31和09:31。因此,在每次有效通话后,您必须再次等待30分钟才能使下一次通话有效。
  3. 出站表也可以包含对同一号码的无,一个或多个呼叫,所有这些呼叫必须尽可能地与来电匹配。
  4. 我尝试了各种方法解决这个问题,但是所有这些方法都不是100%准确,总是让一个或多个调用无法匹配或没有标记为有效等等,而且我的头开始旋转一点点。

    现在我从我的入站调用表构建了一个巨大的表,为previous_calltime和next_calltime添加了许多列,因此我可以计算时间戳之间的分钟数。我采取的第二种方法是创建单独的表格,每个数字等每天都有第一次和最后一次调用,但总是不会加起来。

    以下是我的数据表示例,in-and outbound是相同的。

    +----+-----------+----------+----------+
    | id | call_date | call_time|caller_id
    +----+-----------+----------+----------+
    |  1 | 2013-06-01| 08:00    | 12345
    +----+-----------+----------+----------+
    |  2 | 2013-06-01| 08:20    | 12345
    +----+-----------+----------+----------+
    |  3 | 2013-06-01| 08:30    | 12345
    +----+-----------+----------+----------+
    |  4 | 2013-06-01| 08:32    | 555-999
    +----+-----------+----------+----------+
    |  5 | 2013-06-01| 08:47    | 555-999
    +----+-----------+----------+----------+
    

    也许有人可以指出我应该采取哪种方法。 任何建议表示赞赏。

    P.S。我在这里尝试基于MySQL的100%方法,但理论上我也可以使用PHP,以防万一有人认为这在纯SQL中很难做到,而且使用PHP可能会更容易。

1 个答案:

答案 0 :(得分:0)

要使用的初始代码。

这是忽略日期(暂时),但应该为您提供有效呼叫的列表。不确定它会那么快,但是使用它来填充有效呼叫的某个列表(或将入站呼叫标记为有效或无效)可能是一个想法。

使用上面的测试数据可以得到我期望的结果: -

SELECT Sub1.*, 
        @valid := if(@PrevCallerId != Sub1.caller_id OR (TIME_TO_SEC(call_time) - @PrevValidCall) >= 1800, "valid", "invalid") AS valid_call,
        @PrevValidCall := if(@valid = "valid", TIME_TO_SEC(Sub1.call_time), @PrevValidCall),
        @PrevCallerId := Sub1.caller_id
FROM
(
    SELECT *
    FROM Inbound
    ORDER BY caller_id
) Sub1
CROSS JOIN (SELECT @PrevValidCall:= 0, @PrevCallerId := "", @valid := "") Sub2