选择来自MySQL的行,其中col1是值,另一行是col1不是基于col2相关值的行

时间:2014-03-10 21:53:59

标签: php mysql sql

我的MySQL数据库中有一个表,其中包含以下列:

  • CallId的
  • 事件

我想在以下查询中选择事件为'ENTERQUEUE'的所有行:

SELECT count(*)
FROM voipnow.ast_queue_log
WHERE queuename = '0536*401'
  AND DATE(time) = '2014-03-07'
  AND event = 'ENTERQUEUE'
ORDER BY time DESC;

但我只想显示事件列不等于CONNECT的行数,其中callid等于上述查询中的callid

更新:

当调用进入数据库时​​,会插入一行

示例:

callid - 1234
event - ENTERQUEUE

然后当呼叫圈成圆而没有得到回答时,会插入此数据:

callid - 1234
event - RINGNOANSWER

然后一旦接听电话,数据

callid - 1234
event - CONNECT

一旦电话挂断

callid - 1234
event - COMPLETEAGENT or COMPLETEAGENT

如果来电者在被接听之前挂断

callid - 1234
event - ABANDON

所以当调用者在等待时,只有包含事件的行ENTERQUEUE或RINGNOANSWER

我想显示上面的行数,我需要什么查询

2 个答案:

答案 0 :(得分:0)

我确信有更快的方法来执行此查询,但这里有一个。

Baiscally你想要的是获得所有没有CONNECT或ABANDON的RINGNOANSWER。所以你可以先得到所有的CONNECT / ABANDONS,然后用一个不等于connect / abadon-list的callid来查找所有的RINGNOANSWER ......正是你想要的。你可以这样做:

SELECT COUNT(DISTINCT `callid`) FROM `voipnow`.`ast_queue_log` WHERE `event`='RINGNOANSWER' AND `callid` NOT IN (SELECT `callid` FROM `voipnow`.`ast_queue_log` WHERE `event`='CONNECT' OR `event`='ABANDON')

答案 1 :(得分:0)

使用子查询构建具有有效“CONNECT”事件的所有记录的结果集。然后,您可以使用联接进行修剪,只留下那些不在子查询结果中的记录:

SELECT count(1)
  FROM voipnow.ast_queue_log A
  LEFT JOIN (SELECT callid 
               FROM voipnow.ast_queue_log
              WHERE queuename = '0536*401'
                AND DATE(time) = '2014-03-07'
                AND event = 'CONNECT') B
    ON A.callid = B.callid
 WHERE queuename = '0536*401'
   AND DATE(A.time) = '2014-03-07'
   AND A.event = 'ENTERQUEUE'
   AND B.callid IS NULL;