-4
SELECT t1.*
                FROM asterisk t1
                WHERE EXISTS (SELECT * FROM asterisk t2
                              WHERE t2.id <> t1.id
                              AND t2.unique_id = t1.unique_id
                              AND t1.operator_dial = '203'
                              AND t1.event = 'Dial'
                              AND t2.event = 'Bridge'
                              AND NOT EXISTS (SELECT * FROM asterisk t3
                                          WHERE t3.id <> t1.id
                                          AND t2.unique_id = t3.unique_id
                                          AND t1.operator_dial = '203'
                                          AND t3.event = 'Unlink'))
                ORDER BY date DESC
                LIMIT 1

迅速に機能させるために助けが必要ですが、可能ですか? 何をすべきかを理解しようとして頭が爆発する準備ができています。(テーブルには最大 5k のレコードがあります) そのクエリの説明は次のとおりです。

4

3 に答える 3

0
SELECT t1.*
FROM Asterisk t1
INNER JOIN Asterisk t2
  ON t1.unique_id = t2.unique_id
  AND t2.date > t1.date
  AND t2.event = 'Bridge'
LEFT JOIN Asterisk t3
  ON t1.unique_id = t3.unique_id
  AND t3.event = 'Unlink'
WHERE t1.operator_dial = '203'
  AND t1.event = 'Dial'
  AND t3.id IS NULL
ORDER BY t1.date
LIMIT 1

t1.id <> t2.id を省略したことに注意してください。event 句と date 句は、この条件を暗黙的に強制します。

Dial イベントがあり、その後に Bridge イベントがあるかどうかを確認しますが、Unlink イベントはありません

あなたの要件は「ダイヤルイベントの後に発生するリンク解除イベントがない」と読むことができますが、「リンク解除イベントがない」ということはまったく意味しないと仮定しました。後者の場合は、機能を変更するために t3.date > t1.date を結合に追加できます。

于 2013-08-14T15:18:29.073 に答える
0

何かを見逃していなければ、クエリは次のようになります。

select t1.*
from asterisk as t1
where
    t1.operator_dial = '203' and
    t1.event = 'Dial' and
    exists (
        select *
        from asterisk as t2
        where
            t2.id <> t1.id and t2.unique_id = t1.unique_id
            t2.event = 'Bridge' and t2.date > t1.date
    ) and
    not exists
    (
        select *
        from asterisk as t3
        where
            t3.id <> t1.id and t3.unique_id = t1.unique_id and
            t3.event = 'Unlink' and t3.date > t1.date
    )
order by t1.date desc
limit 1

ただし、インデックス (operator_dial とイベント、および日付) があれば、パフォーマンスが向上します。

于 2013-08-14T15:08:36.343 に答える