SELECT每天出现的用户

时间:2015-06-02 02:42:58

标签: mysql sql

我有一个表面上看似简单的问题,但我发现了挑战,因此请求帮助。我有一个包含两列的表格:

table: USERS

USER_ID | LOGGED_IN_DATE
  001   | 2015-05-01
  002   | 2015-05-01
  003   | 2015-05-01
  001   | 2015-05-02
  ...

我需要的是一个查询,它将返回给定周内每天出现的所有ID,例如2015-05-01到2015-05-07。不只是在一周中的任何时间,但每天必须有该用户的记录。我需要最快速,最简洁的查询。有什么想法吗?

我已经尝试过了:

  1. 子查询
  2. 联盟查询
  3. 自连接
  4. 没有成功。

    谢谢!

2 个答案:

答案 0 :(得分:4)

聚合可能是最简单的方法:

select u.user_id
from users u
where u.LOGGED_IN_DATE >= '2015-05-01' and u.LOGGED_IN_DATE < '2015-05-08'
group by u.user_id
having count(distinct date(u.LOGGED_IN_DATE)) = 7;

如果字段确实是没有时间的日期,那么您不需要date()子句中的having函数。

答案 1 :(得分:0)

在考虑之后,我没有尝试做一些复杂的SQL查询,而是问自己每天上网是什么意思。这意味着在给定时间段内唯一日期的数量应该等于7.所以我认为这个查询效果很好:

select sub.user_id, sub.count 
FROM (select user_id, count(1) as count from users where logged_in_date >= '2015-05-01' AND logged_in_date < '2015-05-08' group by user_id) sub 
where sub.count = 7;

有任何想法/意见吗?

<强>更新

这应该在当天级别处理任意数量的登录:

SELECT DISTINCT user_id, count(1) AS total 
  FROM (SELECT DISTINCT user_id, logged_in_date 
         FROM users 
           WHERE logged_in_date >= '2015-05-01' 
             AND logged_in_date < '2015-05-08' 
               ORDER BY logged_in_date) sub 
   GROUP BY user_id 
   HAVING total = 7;

和@ Gordon的答案一样:

SELECT u.user_id
  FROM users u
   WHERE u.LOGGED_IN_DATE >= '2015-05-01' 
      AND u.LOGGED_IN_DATE < '2015-05-08'
       GROUP BY u.user_id
         HAVING COUNT(DISTINCT DATE(u.LOGGED_IN_DATE)) = 7;

但我更喜欢他。干得好。