1

イベント タイプ B と C の間で同時に発生するタイプ A のすべてのイベントを見つける良い方法を見つけようとしています。

また、イベント B と C は process_id を共有する必要があります。

各 process_id グループには、1 つの B イベントと 1 つの C イベントがあります。

テーブル構造は次のようになります。

CREATE TABLE IF NOT EXISTS `eventlog` (  
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,  
  `time` datetime NOT NULL,  
  `process_id` varchar(20) NOT NULL,  
  `event` varchar(25) DEFAULT NULL,  
  `data` varchar(45) DEFAULT NULL,  
)  

私の試みは次のようになりました:

SELECT q3.time, q3.event, q3.process_id, q3.data   
FROM `eventlog` as q1, `eventlog` as q2, `eventlog` as q3 
WHERE q1.process_id=q2.process_id AND q1.process_id=q3.process_id 
AND q1.event='EVENTB' AND q2.event='EVENTC' AND q3.event='EVENTA'  
AND q3.time BETWEEN q1.time AND q2.time

これを実行すると、ハングします。これを行うためのより効率的な、または固定された方法について何か考えはありますか?

ありがとう!

4

1 に答える 1

2

group by を使用して、各 process_id の開始時刻と終了時刻を取得できます。これを使用して、イベントログ テーブルに再び結合し、必要なレコードを選択できます。

SELECT * FROM eventlog e

JOIN (
    SELECT 
        process_id, 
        MIN(CASE event WHEN 'EVENTB' THEN time END) start_time,
        MAX(CASE event WHEN 'EVENTC' THEN time END) end_time
    FROM eventlog
    GROUP BY process_id
) t
    ON e.time BETWEEN t.start_time AND t.end_time

WHERE
    e.event = 'EVENTA'
于 2011-12-22T17:45:10.233 に答える