Mysql:找到每周登录一次的活跃用户

问题描述:

我有一个表users和另一个表logins每次用户登录到网站我们记录在logins ex前一行。Mysql:找到每周登录一次的活跃用户

Users 
----- 
14 | name1 
17 | name2 
20 | name3 
21 | name4 
25 | name5 

logins 
---- 
14 | 2015-03-01 
14 | 2015-03-07 
14 | 2015-03-16 
14 | 2015-03-24 
14 | 2015-03-30 
17 | 2015-03-01 
17 | 2015-03-07 
17 | 2015-03-16 
17 | 2015-03-17 
17 | 2015-03-30 
20 | 2015-03-01 
20 | 2015-03-07 
20 | 2015-03-08 
20 | 2015-03-16 
20 | 2015-03-25 
20 | 2015-03-30 

如果开始日期为2015-03-01和结束日期是2015-04-01然后14 & 20应选择同时17不会被选择,因为他没有在03-2203-28一周登录,从而使结果将是

Result 
    ------ 
    2 
+0

我没有正确理解这个问题。你如何计算一周?从星期天到星期天的午夜?你能否给出一个更详细的例子和基于这样的输出样本? – Utsav

+0

那么如何定义你的周开始和周末呢? –

+0

@Utsav谢谢我更新了一个更好的例子问题 – trrrrrrm

首先你每周的用户已经在至少一次登录的名单,那么你每月计算用户的数量:

SELECT LoginYear,LoginWeek,COUNT(*) as NumbUsers 
FROM (
    SELECT Year(logins.date) as LoginYear, Week(logins.date) as LoginWeek, logins.UserID 
    FROM logins 
    WHERE logins.date>='2015-03-01' 
    GROUP BY LoginYear, LoginWeek, logins.UserID 
    HAVING COUNT(*)>0 
) t 
GROUP BY LoginYear,LoginWeek; 


周编号: MySQL能够算以不同的方式(例如从星期天/星期一开始)使用模式:WEEK(date,mode)。请参阅WEEK MySQL documentation


更新:获得已记录每星期至少一次的人数:首先我们得在子查询weektable被记录在每星期至少一次的用户。然后,用户选择具有等于该周期中的总周数(因此每周在线)的周计数。最后我们数一下这些用户。

SELECT COUNT(*) 
FROM (
    SELECT UserID 
    FROM (
    SELECT Year(logins.date) as LoginYear, Week(logins.date) as LoginWeek, logins.UserID 
    FROM logins 
    WHERE logins.date>='2015-03-01' 
    GROUP BY LoginYear, LoginWeek, logins.UserID 
    HAVING COUNT(*)>0 
    ) weektable 
    GROUP BY UserID 
    HAVING COUNT(*)>=TIMESTAMPDIFF(WEEK,'2015-03-01',NOW()) 
) subq; 

注1:我把日期“2015年3月1日”作为一个例子,但你可以改变这或将作为一个变量。

注2:取决于您选择它可以通过TIMESTAMPDIFF周计数小于周的最大数量(由COUNT(*)计),因为它不指望半周的日期。所以我把>=放在最后一行:HAVING COUNT(*)>=TIMESTAMPDIFF(WEEK,'2015-03-01',NOW())

+0

谢谢你的回答。这将显示在该范围内的任何给定周内登录的用户总数。我需要的是自开始日期以来每周登录的用户总数 – trrrrrrm

+0

真棒,它按预期工作!谢谢 – trrrrrrm

我不能在此刻却喜欢

SELECT COUNT(Users.id) WHERE logins.date>=XXXX AND logins.date<=XXXX GROUP BY Users.id 

的东西在这里进行测试应该工作

+0

这不会排除用户登录第1周9月但不是星期2 9月 – trrrrrrm

+0

不好给我一个答案的反对票,这是正确的,你的不明确的定义的排队。 –