Найти все события журнала типа A, которые происходят между типами B и C - PullRequest
1 голос
/ 22 декабря 2011

Я пытаюсь найти хороший способ найти все события типа A, которые происходят одновременно между типами событий B и C.

Кроме того, события B и C должны иметь общий идентификатор процесса.

Каждая группа process_id будет иметь одно событие B и одно событие 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

Когда я запускаю это, оно зависает. Есть мысли о более эффективном или фиксированном способе сделать это?

Спасибо!

1 Ответ

1 голос
/ 22 декабря 2011

Вы можете использовать группу, чтобы получить время начала и окончания для каждого идентификатора процесса. Затем его можно использовать для присоединения к таблице журнала событий и выбора необходимых записей.

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'
...