2015-12-26 117 views
1

我正在使用MySQL版本5.5。 我有以下的列的事件日誌表:在特定日期查詢組成員的MySQL事件日誌

  • ID(INT,自動增量)
  • 活動日期(DATE)
  • EVENT_TYPE(ENUM '增加了' 或 '已刪除')
  • GROUP_ID (INT,外鍵)
  • USER_ID(INT,外鍵)

表包含事件的日誌所發生添加或刪除用戶T當o組。例如:

1, '2015年1月10日', 'ADDED',10,200
2, '2015年1月11日', 'ADDED',10,300
3,「2015 - 01-15','REMOVED',10,200

這意味着ID爲「200」的用戶是從1月10日至1月15日(包括兩端)的ID爲「10」的組的成員。

同樣,ID爲「300」的用戶在1月11日成爲ID爲「10」的組的成員,並且仍然是成員。

我該如何構建一個查詢,告訴我哪些用戶是特定日期的一個或多個特定組的成員?

I.e.問題可能是:「在2015年10月24日,哪些用戶是200或300組的成員?」

+0

您的數據庫設計是否已修復,還是可以更改它?這種類型的問題通過表格給出用戶和組之間的關係很容易回答,例如通過讓用戶成爲成員的日期以及用戶離開組的日期。 如果您無法更改設計,則可能必須使用我概述的結構來構建臨時表以提取您正在查找的信息。 –

+0

不幸的是,數據庫設計已修復。我試圖查詢由我沒有源代碼的程序創建的現有數據庫。我正在尋找一種可以表示爲查詢的解決方案,或者作爲一個MySQL過程 - 我寧願不必使用單獨的程序構建額外的臨時表。 – jksoegaard

+0

我假設在2015-10-15知道某人是否是某個組的成員的唯一方法是查看完整日誌,從開頭到指定日期,並查看2015年之前誰成爲成員-10-15,並且在2015-10-15仍是會員。 這個假設是否正確? 你有多少數據,它有多遠? –

回答

1

根據我們的討論,我認爲這個查詢會給你你想要的。

SELECT user_id FROM (
    SELECT * FROM (
    SELECT * FROM user_group 
    WHERE group_id IN (200, 300) AND event_date <= '2015-10-24' 
    ORDER BY user_id, event_date desc, id desc, event_type desc) A 
    GROUP BY user_id, group_id) B 
WHERE event_type = 'ADDED' 
GROUP BY user_id; 
+0

據我瞭解查詢(如果我錯了,請糾正我) - 它通過檢索按用戶和日期排序的日誌事件列表,然後依靠GROUP BY的MySQL實現來獲取僅第一個這些事件爲每個用戶。即您將獲得每個用戶最近發生的事件的列表,然後僅採用添加了最近事件的那些事件。但是,我不認爲這個查詢適用於我的場景。示例:將用戶添加到組200和300,然後從組300中刪除。當查詢用戶是200還是300時,查詢會錯誤地說「不」? – jksoegaard

+0

我檢查了一個組的查詢,所以你可能是對的。您可以通過使用「GROUP BY user_id,group_id」來更改它。 如果你上傳你的數據的一個子集,我可以用它來運行一些測試。 –

+0

嗯,是的 - 但後來我需要在最後加上一個額外的「GROUP BY user_id」 - 對嗎? (以擺脫屬於多個組的用戶的重複) – jksoegaard