2016-08-01 76 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() 
相关问题