我的MySQL数据库中有一个表,其中包含以下列:
我想在以下查询中选择事件为'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
我想显示上面的行数,我需要什么查询
答案 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;