从表中查找过去一年中每周至少进行一项活动的所有用户

时间:2018-10-12 09:37:09

标签: mysql sql

我有两个tables user [user_id,name]task [task_id,title,fk_user]。我想从用户表中找出过去1年中每周至少进行一项活动的所有用户。 例子

用户

  user_id(primaryKey) name   created_at
     1                Alice  2018-05-03 10:22:56
     2                Bob    2018-05-04 10:22:56

任务

    task_id(primaryKey) title fk_user created_at
      1                  t1     1      2018-05-04 10:22:56
      2                  t2     1      2018-05-04 10:23:56
      3                  t1     2      2018-05-04 10:24:56
      4                  t2     2      2018-05-04 10:24:56

结果

    user_every_week_in_past_year 
      1  
      2   

2 个答案:

答案 0 :(得分:1)

我认为类似这样的方法应该可以工作...如果没有完整的示例数据,很难确定:

SELECT name
FROM (SELECT u.name, COUNT(t.task_id) AS tasks
      FROM user u
      JOIN task t
      ON t.fk_user = u.user_id
      WHERE t.created_at > CURDATE() - INTERVAL 52 WEEK
      GROUP BY u.name, WEEK(t.created_at)
      ) ut
GROUP BY name
HAVING COUNT(tasks) = 52

子查询生成一个列表,该列表列出了过去52周中每个用户在每周中执行的任务数。然后将其按用户在外部查询中再次分组,并且仅列出每周执行任务的用户,因为他们是唯一拥有COUNT(tasks) = 52

的用户

答案 1 :(得分:0)

我从@Nick答案中得出了这个答案

SELECT fk_user as user_every_week_in_past_year from (
   SELECT fk_user,count(task_id) as activties FROM `task` 
   where created_at > CURDATE() - INTERVAL 52 WEEK 
   group by fk_user, WEEK(created_at)) ua 
   group by fk_user having count(activties) = 52;

我不认为需要与用户表联接来查找记录。子查询将所有任务查找为用户在过去一年中每周执行的活动,并再次按用户ID分组以达到所需结果。