我有两个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
答案 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分组以达到所需结果。