次のフィールドとインデックスを含むテーブルがあります。
実行するクエリを作成する必要があります。
テーブルを確認してください。ダイヤルイベントがあり、その後 (同じ unique_id で)ブリッジまたはハングアップイベントが発生 しない場合
また
NewCallerIdイベントがあり、その後にHangupイベントがない場合 (同じ unique_id の場合) またはDialイベントがない場合 (call_id = 現在の unique_id の場合)
クエリが 1 つありましたが、うまくいきませんでした。また、ユーザーの回答も役に立ちませんでした。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 つのスクリーンショットを作成しました (上部にはクエリ結果に含まれない呼び出しがいくつかあり、下部にはクエリ結果に含まれる必要がある 1 つの呼び出しがあります。