Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql:查找每周登录一次的活动用户_Mysql_Sql - Fatal编程技术网

Mysql:查找每周登录一次的活动用户

Mysql:查找每周登录一次的活动用户,mysql,sql,Mysql,Sql,我有一个表users和另一个表logins每当用户登录网站时,我们都会在loginsex中记录一行 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 | 201

我有一个表
users
和另一个表
logins
每当用户登录网站时,我们都会在
logins
ex中记录一行

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-22
03-28
的一周内没有登录,因此结果将是

   Result
   ------
   2

我现在不能在这里测试,但类似的

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

选择COUNT(Users.id),其中logins.date>=XXXX和logins.date首先,您会获得每周至少登录一次的用户列表,然后每月计算用户数量:

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)
以不同的方式(例如从周日/周一开始)计算周数。看


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

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-03-01”为例,但您可以更改此日期或将其作为变量


注2:根据您选择的日期,可能是
TIMESTAMPDIFF
计算的周数小于最大周数(由
count(*)
计算),因为它不计算半周。因此,我把
>=
放在最后一行:
HAVING COUNT(*)>=timestamdiff(WEEK,'2015-03-01',NOW())

这不会排除那些在9月1日而不是9月2日登录的用户,如果你的问题定义不明确,给我一个正确的答案投反对票并不好。我没有正确理解这个问题。你怎么计算一周?从周日午夜到周日午夜?你能在此基础上给出一个更详细的示例和示例输出吗?那么你是如何定义你的周开始和周结束的呢?@Utsav谢谢,我更新了这个问题以便更好地理解example@AbhikChakraborty星期天或星期一不要紧,我可以改变它来满足我的需要,只要它工作谢谢你的回答。这将显示在该范围内任何给定周内登录的用户总数。我需要的是自开始日期起每周登录的用户总数