1

我正在尝试找到一种很好的方法来查找在事件类型 B 和 C 之间同时发生的所有类型 A 的事件。

此外,事件 B 和 C 必须共享一个 process_id。

每个 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

当我运行它时,它挂起。关于更有效或更固定的方法来做到这一点的任何想法?

谢谢!

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 回答