2016-08-01 66 views
1

問題描述如何查詢數據的第一個月爲每個用戶

我有一個數據表multiplayergame那裏有每個UserID是多人遊戲中,詳細說明他們的活動多條記錄,以及日期DateID,遊戲發生在。

問題

我怎樣才能查詢內發生的每一個用戶的遊戲他們的第一場比賽的第一個月?即抓取該用戶在第一個多人遊戲的第一個記錄30天內發生的所有行?

+0

你可以用'between' 30天開始日期和sys.date –

+0

但是每個用戶都有一個不同的開始日期;即,一個用戶可能在2013年11月,2014年1月再次發生了他們的第一次發生。你的解決方案只能抓住第一個月的數據,期限嗎​​?不爲第一個月後開始的用戶捕獲數據? – potatosoup

+0

歡迎來到SO。 請閱讀[我可以問哪些主題](http://stackoverflow.com/help/on-topic) 和[如何提出一個好問題](http://stackoverflow.com/help/how-to - 問) 和[完美的問題](http://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/) [如何創建一個最小,完整和可驗證的例子] (http://stackoverflow.com/help/mcve) SO是**不是免費的編碼或代碼轉換或調試或教程或圖書館尋找服務**您還必須表明,你已經努力解決你的問題自己的問題。 – RiggsFolly

回答

1

這將是緩慢的,如果你有大量的用戶,但它會奏效。子查詢獲取用戶ID和他們的第一個遊戲的DateID列表,然後選擇所有在該日期和接下來的30天之間(每個用戶)的DateID的遊戲。如果您將第一個遊戲日期添加到用戶表或使用用戶created_at日期,則可以加速很多,因爲完全使用索引。

SELECT * FROM multiplayergame m1 
JOIN (SELECT MIN(m.DateID) as first_game, m.UserID 
FROM multiplayergame m 
GROUP BY m.UserID) der on der.UserID=m1.UserID and m1.DateID BETWEEN der.first_game AND der.first_game + INTERVAL 30 DAY 
+0

謝謝!你的解決方案就像一個魅力。乾杯 – potatosoup

0

像下面這樣會給你的行:

WHERE create_date BETWEEN create_date() AND DATE_ADD(create_date, INTERVAL 30 DAY) 
0

是一樣@Pritam班納吉的回答CURDATE()。但是選擇表*。

SELECT * 
FROM multiplayergame 
WHERE DateID BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE() 

您也可以使用NOW()

SELECT * 
FROM multiplayergame 
WHERE DateID BETWEEN NOW() - INTERVAL 30 DAY AND NOW() 
相關問題