我有以下字段和索引的表:
我需要做一个查询:
检查表,如果有拨号事件,之后(具有相同的 unique_id)没有桥接或挂断事件发生
或者
如果有NewCallerId事件,之后没有Hangup事件(具有相同的 unique_id)或没有Dial事件(具有 call_id = current unique_id)
有一个查询,但我没有让它工作,用户的回答也没有帮助。这是在 395 秒(太长)内完成工作的查询:
SELECT t1.*
FROM ASTERISK t1
WHERE EXISTS (SELECT t2.*
FROM ASTERISK t2
WHERE t1.OPERATOR_DIAL = '$extension'
AND t1.EVENT = 'Dial'
AND NOT EXISTS (SELECT t3.*
FROM ASTERISK t3
WHERE t3.UNIQUE_ID = t1.UNIQUE_ID
AND ( t3.EVENT = 'Hangup'
OR t3.EVENT = 'Bridge' )))
OR EXISTS (SELECT t4.*
FROM ASTERISK t4
WHERE t1.EVENT = 'NewCallerid'
AND t1.OPERATOR_DIAL = '$extension'
AND NOT EXISTS (SELECT t5.*
FROM ASTERISK t5
WHERE ( t5.UNIQUE_ID = t1.UNIQUE_ID
AND t5.EVENT = 'Hangup' )
OR ( t5.CALL_ID = t1.UNIQUE_ID
AND t5.EVENT = 'Dial' )))
ORDER BY DATE DESC
LIMIT 1
尝试使用 JOINS 重写它,但得到#1248 - 每个派生表都必须有自己的别名
这是我对 JOIN 查询的尝试:
SELECT t1.*
FROM asterisk t1
INNER JOIN (SELECT t2.* FROM asterisk t2
WHERE
t1.operator_dial = '$extension'
AND t1.event = 'Dial'
LEFT OUTER JOIN (SELECT t3.* FROM asterisk t3
WHERE t3.unique_id = t1.unique_id AND (t3.event = 'Hangup' OR t3.event = 'Bridge')))
OUTER JOIN (SELECT t4.* FROM asterisk t4
WHERE t1.event = 'NewCallerid'
AND t1.operator_dial = '$extension'
LEFT OUTER JOIN (SELECT t5.* FROM asterisk t5
WHERE (t5.unique_id = t1.unique_id AND t5.event = 'Hangup') OR (t5.call_id = t1.unique_id AND t5.event = 'Dial')))
ORDER BY DATE DESC
LIMIT 1
为了展示查询应该如何工作,我制作了 2 个屏幕截图(顶部有一些不会出现在查询结果中的调用,底部是一个必须出现在查询结果中的调用: