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

时间:2015-10-16 07:03:18

标签: mysql sql

我有一个表users和另一个表logins,每当用户登录我们在logins前的行中记录一行时,

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

2 个答案:

答案 0 :(得分:1)

首先,您获得每周至少登录一次的用户列表,然后每月计算用户数量:

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

更新:获取每周至少登录一次的人数:首先,我们在子查询{{1}中获取每周至少登录一次的用户}。然后选择具有周计数的用户,该周计数等于该周期中的总周数(因此每周在线)。最后我们统计这些用户。

weektable

注1:我将日期'2015-03-01'作为示例,但您可以更改此项或将其作为变量。

注2:取决于您选择的日期,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; 的周数可能小于最长周数(按TIMESTAMPDIFF计算),因为它不算半周。因此,我将COUNT(*)放在最后一行:>=

答案 1 :(得分:-1)

我现在不能在这里测试它,但是像

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

应该有效