2014-09-23 78 views
-2

我有一个查询报告Asterisk调用使用情况和队列统计信息。查询当前使用MySQL WHERE子句来连接表并过滤数据。将MySQL查询从WHERE更改为LEFT JOIN

这是查询如何看待目前:

SELECT 
    c.name as 'Agent', 
    e.extended_number AS 'Extension', 
    COUNT(ql.`time`) AS 'Total Inbound Calls', 
    (SELECT 
      COUNT(1) 
    FROM 
     call_history ch, 
     ast_queue_mstatus qm 
    WHERE 
     ch.start >= (DATE_SUB(DATE(NOW()), 
      INTERVAL 10050 MINUTE)) 
      AND ch.start <= (DATE(NOW())) 
      AND ch.calltype = 'out' 
      AND ch.flow = 'out' 
      AND ch.extension_number = qm.membername 
      AND qm.membername = e.extended_number 
    GROUP BY qm.membername) AS 'Total Outbound Calls', 
    FORMAT(SUM(CAST(ql.arg2 AS UNSIGNED))/60, 2) AS 'Total Inbound Duration', 
    FORMAT(AVG(CAST(ql.arg2 AS UNSIGNED))/60, 2) AS 'Avg Inbound Duration', 
    FORMAT(AVG(CAST(ql.arg1 AS UNSIGNED))/60, 2) AS 'Avg Caller Hold Time' 
FROM 
    ast_queue_log ql, 
    ast_queue_mstatus qs, 
    client c, 
    extension e 
WHERE 
    ql.queuename = '1234' 
    AND ql.`time` >= (DATE_SUB(DATE(NOW()), INTERVAL 7 DAY)) 
    AND ql.`time` <= (DATE(NOW())) 
    AND (ql.event = 'COMPLETEAGENT' 
    OR ql.event = 'COMPLETECALLER' 
    OR ql.event = 'COMPLETETRANSFER') 
    AND RIGHT(ql.agent, 8) = qs.membername 
    AND qs.membername = e.extended_number 
    AND e.client_id = c.id  
GROUP BY ql.agent 
ORDER BY c.name; 

,我的问题是,我需要返回对于尚未收到任何呼入呼叫队列成员外呼结果。目前,如果ast_queue_log中没有记录,则WHERE子句将排除记录,这意味着它们不会被标量子查询拾取。

如何更改此查询,以便我从call_history中获得所有通话记录,其中ast_queue_mstatus中对应的记录?

对不起,如果这太复杂或没有足够的信息,我可以尝试简化,如果这没有意义!

+0

我给了一个答案,但现在我看到答案的核心(将条件从左到右连接)已经在您的标题中。让我感到奇怪:如果你已经知道,你为什么问? – GolezTrol 2014-09-23 17:03:21

+0

@GolezTrol谢谢你的回答,我问这个问题的原因是我明白左连接是答案,但无法理解语法和需要什么。你的回答非常有帮助,我希望今天下午实施:) – btongeorge 2014-09-26 11:25:32

回答

1

现在是放弃这些旧的逗号分隔的表格列表并使用1992年引入的连接标准(是)的时候了。 :-)

因为那时你可以使用一个LEFT JOIN。通过这种连接,关系是可选的。也就是说,将返回第一个表中的所有行(如果它们与WHERE子句中的条件相匹配),但连接的表不必包含记录。 如果不是,则仍然返回一行,但字段中填充的值为NULL

SELECT 
    c.name as 'Agent', 
    e.extended_number AS 'Extension', 
    COUNT(ql.`time`) AS 'Total Inbound Calls', 
    (SELECT 
     COUNT(1) 
    FROM 
     call_history ch 
     INNER JOIN ast_queue_mstatus qm 
      ON qm.membername = ch.extension_number 
    WHERE 
     ch.start >= (DATE_SUB(DATE(NOW()), INTERVAL 10050 MINUTE)) 
     AND ch.start <= (DATE(NOW())) 
     AND ch.calltype = 'out' 
     AND ch.flow = 'out' 
     AND ch.extension_number = e.extended_number 
    GROUP BY 
     ch.extension_number) AS 'Total Outbound Calls', 
    FORMAT(SUM(CAST(ql.arg2 AS UNSIGNED))/60, 2) AS 'Total Inbound Duration', 
    FORMAT(AVG(CAST(ql.arg2 AS UNSIGNED))/60, 2) AS 'Avg Inbound Duration', 
    FORMAT(AVG(CAST(ql.arg1 AS UNSIGNED))/60, 2) AS 'Avg Caller Hold Time' 
FROM 
    client c, 
    INNER JOIN extension e 
     ON e.client_id = c.id 
    INNER JOIN ast_queue_mstatus qs 
     ON qs.membername = e.extended_number 
    LEFT JOIN ast_queue_log ql 
     ON ql.queuename = '1234' 
     AND ql.`time` >= (DATE_SUB(DATE(NOW()), INTERVAL 7 DAY)) 
     AND ql.`time` <= (DATE(NOW())) 
     AND (
      ql.event = 'COMPLETEAGENT' 
      OR ql.event = 'COMPLETECALLER' 
      OR ql.event = 'COMPLETETRANSFER') 
     AND RIGHT(ql.agent, 8) = qs.membername 
GROUP BY ql.agent 
ORDER BY c.name; 

您可以使用RIGHT JOIN以及加入其他方式(第一个表是可选的)。但总的来说,这很难解释。