2014-02-13 62 views
0

我在该区域看到了很多帖子,但找不到确切的帖子。 我有一个表,它将所有用户登录注册到我的应用程序,它包含两列 - userID和timeOfLogin。它看起来像:日期范围内每位用户每天登录的次数

userID, timeOfLogin 
1  , 14-01-10 00:07:38 
2  , 14-01-10 01:28:45 
3  , 14-01-10 01:28:45 
1  , 14-01-09 02:04:08 
1  , 14-01-09 06:14:54 
etc.... 

我想有一个统计,每天唯一的用户登录,因为一个特定的“第1天”,我在查询定义(第2天是第二天等)的数量的表格。该表应该是这个样子:

userID, numOFLogins day1, numOfLogins Day2, numOfLogins Day3, ...., numOfLogins DayN 
1  ,  10   , 12    , 0    , ...., 12 
2  ,  3   , 6    , 7    , ...., 15 
132 ,  0   , 5    , 9    , ...., 14 
+1

为什么你想每天有“列”? – Chris

回答

3

您可以有条件聚集做到这一点:

select userId, 
     sum(date(timeOfLogin) = date(@day1)) as NumLogins_0, 
     sum(date(timeOfLogin) = date(date(@day1) + 1)) as NumLogins_1, 
     sum(date(timeOfLogin) = date(date(@day1) + 2)) as NumLogins_2, 
     sum(date(timeOfLogin) = date(date(@day1) + 3)) as NumLogins_3, 
     sum(date(timeOfLogin) = date(date(@day1) + 4)) as NumLogins_4 
from table t 
group by userId; 

在MySQL中,date(timeOfLogin) = @day1被视为0当表达式是假的,1当它是真实的。

我只是使用@day1来表示日期的变量,不管它是什么。

这将适用于固定数量的列(例如上面显示的5天)。如果你想要一个可变数量的列,那么你不能用一个简单的SQL语句来做到这一点。您需要用字符串构造SQL,使用prepare并执行它。

+0

我只是添加了一个where子句来限制他们尝试的日期范围,否则只有5天的测试时间才能通过2年的登录来运行。 – DRapp

+0

@DRapp。 。 。我同意。假设'timeOfLogin'上有索引。但是,如果他/她决定添加更多列,OP将需要小心地保持'where'子句与'select'对齐。 –

+0

Thx Gordon,我试着用这种方式执行:select NumLogins_0, sum('2014-10-01'= @ day1)sum(date(timeOfLogin)= date(@ day1 + 1)as NumLogins_1, (timeOfLogin)= date(date1 + 4)sum(date(timeOfLogin)= date(@ day1 + 2) )作为NumLogins_4 from loginsperuser group by userId;并一直得到:#1064 - 你的SQL语法有错误; - 任何想法? –

相关问题