将MySQL查询从何处更改为左连接
我有一个查询报告星号呼叫使用情况和队列统计信息。查询当前使用MySQL WHERE子句连接表并过滤数据 以下是当前查询的外观:将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,
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;