将MySQL查询从何处更改为左连接

将MySQL查询从何处更改为左连接,mysql,join,left-join,asterisk,Mysql,Join,Left Join,Asterisk,我有一个查询报告星号呼叫使用情况和队列统计信息。查询当前使用MySQL WHERE子句连接表并过滤数据 以下是当前查询的外观: SELECT c.name as 'Agent', e.extended_number AS 'Extension', COUNT(ql.`time`) AS 'Total Inbound Calls', (SELECT COUNT(1) FROM call_history ch,

我有一个查询报告星号呼叫使用情况和队列统计信息。查询当前使用MySQL WHERE子句连接表并过滤数据

以下是当前查询的外观:

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子句将排除这些记录,这意味着标量子查询不会提取这些记录

如何更改此查询,以便从呼叫历史记录中获取所有呼叫记录,其中ast_队列_mstatus中有相应的记录


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

是时候抛弃那些旧的逗号分隔表列表,使用1992年引入的联接标准了是的:-

因为这样就可以使用左连接。对于这种连接,关系是可选的。也就是说,如果第一个表中的所有行与WHERE子句中的条件匹配,则返回它们,但是联接的表也不必有记录。 如果没有,则仍然返回一行,但字段中填充空值


您还可以使用RIGHT JOIN,以另一种方式围绕第一个表进行连接,这是可选的。但总的来说,这更难解释。

我给出了答案,但现在我看到答案的核心——从何处移动到左连接的条件已经在标题中了。让我想知道:如果你已经知道了,为什么要问?@GolezTrol谢谢你的回答,我问这个问题的原因是我知道左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
        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;