2013-04-29 148 views
1

我有一個MySQL與下面的表結構:MySQL查詢(順序記錄...)

table mt_events 
id - record id 
doc_id - document id 
event_id - event id 
date - event date 
user - user 

的問題是,我需要所有的有一個事件3有以下事件的文檔的報告4,除了一個文件可以有MULTIPLE事件3,它可能會或可能不會跟在事件4之後,這似乎相當簡單的JOIN,除非事件4 ... 像這樣:

1 3a 4a 11 12 8 3b 4b 3c 4c 3 17 5

到目前爲止,我已經:

SELECT ev.date AS Event1, ev.user AS User1, ev2.date AS Event2, ev2.user AS User2 
FROM `mt_events` ev 
JOIN mt_events ev2 ON ev2.doc_id = ev.doc_id AND ev2.event = 4 AND ev2.date > ev.date 
WHERE ev.event = 3 AND ev.date LIKE '2013-03%' 

但是,這並不產生需要的結果 -

3a 4a 
3b 4b 
3c 4c 

,並給出 -

3a 4a 
3a 4b 
3b 4b 
3a 4c 
3b 4c 
3c 4c 

任何幫助,將不勝感激......

+0

你能不能解釋一下什麼是值1 3A 4A等都是? 「3」是事件代碼,「a」是文件代碼? – 2013-04-29 10:44:59

+0

@vincebowdren:如果我理解正確,'3'是事件編號字段(稱爲'event'),'a'是'date'的符號表示。 – 2013-04-29 10:51:57

+0

只是一個文檔的事件順序的象徵性表示,以及它們應如何配對。 – GTMeteor 2013-04-29 10:59:55

回答

2

嘗試:

SELECT ev.date AS Event1, ev.user AS User1, ev2.date AS Event2, ev2.user AS User2 
FROM `mt_events` ev 
JOIN mt_events ev2 ON ev2.doc_id = ev.doc_id AND ev2.event = 4 AND ev2.date = 
    (select min(el.date) from `mt_events` el 
    where el.doc_id = ev.doc_id AND el.event = 4 AND el.date > ev.date) 
WHERE ev.event = 3 AND ev.date LIKE '2013-03%' 
+0

工作就像一個魅力。謝謝。我不知道你可以做比較部分的選擇... – GTMeteor 2013-04-29 10:45:13

+0

@ user1711368:很高興我能幫上忙。 – 2013-04-29 10:49:54

0

嘗試移動ev2.event = 4 AND ev2.date > ev.date到WHERE子句。這似乎更合適。

此外,您似乎沒有關於表中直接優先級的信息 - 只有它們的順序(日期)。所以你試圖執行的查詢將返回每對事件3和4的行,其中3發生在4之前(但不是緊接在之前)。

您應該使用存儲過程或其他方式遍歷結果並篩選出不符合條件的結果。