2014-01-08 50 views
5

可以說100是一個開始,101是一個停止事件。這些應該交替,我想找出他們什麼時候沒有。每次開始都應該有事先停止事件。鑑於此表:MySQL查找行

ID EVENT_ID 
10 100 // a start event 
11 101 // a stop event 
12 99 // some irrelevant event 
13 100 // .. and so on: 
14 101 
15 100 
16 99 // some irrelevant event 
17 100 // <-- duplicate event: bad 
18 100 // <-- duplicate event: bad again. 
19 101 

我遺漏了DATETIME列。

如何找到#15和#17,考慮到開始不應該連續發生兩次?
結果應該是形式:

EVENT_ID FROM_ID FROM_DATETIME UPTO_ID UPTO_DATETIME 
100  15  2014-01-01 14:00 17  2014-01-01 16:00 

我想它可能會像這樣工作:
- 子查詢只找到DATETIME有序事件100,101。
- 按EVENT_ID使用count()
..但我懷疑這會崩潰的結果,作爲組會忽略排序,
查找重複..和我不知道如何讓兩個(​​或更多! )各自的DATETIME值。

是否有可能在MySQL中找到它?我可以在PHP中處理這個問題,但我寧願避免這種情況。

+0

有關選擇已事項標識= 100,下一個行不具有價值101的所有行麼?可以辦到。 – Goikiu

+0

@Goikiu這是問題。語法是什麼? –

+0

爲了做正確的sintax我們需要一些解釋。 1)身份證是唯一的?你可以有身份證複印件嗎?是根據? – Goikiu

回答

3

在我的示例中,所有行都具有相同的日期時間值。

DROP TABLE IF EXISTS T; 
CREATE TABLE T 
    (`ID` int auto_increment primary key, `EVENT_ID` int, dt timestamp) 
; 

INSERT INTO T 
    (`ID`, `EVENT_ID`) 
VALUES 
    (10, 100), 
    (11, 101), 
    (12, 99), 
    (13, 100), 
    (14, 101), 
    (15, 100), 
    (16, 99), 
    (17, 100), 
    (18, 100), 
    (19, 101) 
; 

select id, event_id, dt as up_to_dt, prevgood, prevdt as from_dt from 
(
select 
T.* 
, if((@startstop = 100 and event_id = 101) or (@startstop = 101 and event_id = 100), 'good', 'bad') as goodbad 
, @prevgood := if(if((@startstop = 100 and event_id = 101) or (@startstop = 101 and event_id = 100), 'good', 'bad') = 'bad', @prevgood, id) as prevgood 
, @prevdt := if(if((@startstop = 100 and event_id = 101) or (@startstop = 101 and event_id = 100), 'good', 'bad') = 'bad', @prevdt, dt) as prevdt 
, @startstop := event_id 
from 
T, (select @startstop:=101, @prevgood:=0, @prevdt:=0) vars 
where event_id in (100, 101) 
order by id 
) sq 
where goodbad = 'bad'; 

返回

+----+----------+---------------------+----------+---------------------+ 
| id | event_id | up_to_dt   | prevgood | from_dt    | 
+----+----------+---------------------+----------+---------------------+ 
| 17 |  100 | 2014-01-20 09:12:20 |  15 | 2014-01-20 09:12:20 | 
| 18 |  100 | 2014-01-20 09:12:20 |  15 | 2014-01-20 09:12:20 | 
+----+----------+---------------------+----------+---------------------+ 
+0

對不起@fancyPants我的意思是'ID'作爲自動增量,但在記錄17時輸入了一個錯字。你的解決方案很有趣,首先我已經看到了這個語法..我需要進一步研究你的解決方案,然後才能接受最終答案。 (有點忙atm) –

+2

@BarryStaes看着我的答案,看到了,我引用了一個不在那裏的列。有些東西在複製和粘貼過程中似乎出錯了。現在它已經被修正,我刪除了之前添加的auto_increment列。我調整了您的樣本數據(更正了記錄17中的錯字)。現在一切都會好起來的。 – fancyPants