我有下表/数据(示例)
用户
user_id | email
1 | asd@asd.com
2 | asd2@asd.com
3 | asd3@asd.com
4 | asd4@asd.com
5 | asd5@asd.com
预定作业
job_id | user_id | date
1 | 1 | 05/09/2019
2 | 1 | 05/10/2019
3 | 1 | 05/11/2019
4 | 1 | 05/12/2019
5 | 2 | 07/10/2019
6 | 2 | 07/11/2019
7 | 2 | 07/12/2019
8 | 3 | 11/07/2019
9 | 4 | 13/10/2019
10 | 4 | 13/11/2019
11 | 5 | 10/10/2019
12 | 5 | 10/11/2019
13 | 5 | 10/12/2019
最后更新
update_id | job_id
1 | 1
2 | 2
3 | 3
4 | 5
5 | 9
6 | 11
创建用户时,也会创建计划作业列表。当用户完成作业时,Last_Update 表就会更新。
我正在尝试根据日期显示未完成作业的用户列表。例如,1-30 天的延迟:x 个用户,31-60 天的延迟:y 个用户等
根据上面的示例,预期结果如下:
Number of users with no delayed jobs: 2 (users 1 & 4)
1-30 days delay: 2 (users 2 & 5)
31-60 days delay: 0
Over 60 days delay: 1 (user 3)
我目前仅显示没有延迟作业的用户数量
SELECT u.user_id
FROM users u
LEFT JOIN (
SELECT j.user_id AS completed
FROM jobs j
LEFT JOIN last_update lu
ON lu.job_id = j.job_id
WHERE j.job_date <= CURDATE()
AND lu.update_id IS NULL
) AS cj
ON u.user_id = cj.completed
WHERE cj.completed IS NULL
最佳答案
您可以首先连接三个表,按 user_id
聚合并计算每个用户
- 他们还有多少未完成的工作
- 过去 30 天内他们有多少未完成的工作
- 过去 31-60 天内他们有多少未完成的工作
然后,您可以添加另一个聚合级别并计算有多少用户满足每个条件。
查询:
select
sum(cnt_jobs_unfinished = 0) cnt_users_no_unfinished_jobs,
sum(cnt_jobs_unfinished_30d > 0) cnt_users_unfinished_30d,
sum(cnt_jobs_unfinished_31_60d > 0) cnt_users_unfinished_31_60d
from (
select
u.user_id,
sum(l.job_id is null) cnt_jobs_unfinished,
sum(
l.job_id is null
and j.date >= curdate() - interval 30 day
) cnt_jobs_unfinished_30d,
sum(
l.job_id is null
and j.date < curdate() - interval 30 day
and j.date >= curdate() - interval 60 day
) cnt_jobs_unfinished_31_60d
from users u
inner join scheduled_jobs j
on j.date <= curdate()
and j.user_id = u.user_id
left join last_update l
on l.job_id = j.job_id
group by u.user_id
) t
cnt_users_no_unfinished_jobs | cnt_users_unfinished_30d | cnt_users_unfinished_31_60d ---------------------------: | -----------------------: | --------------------------: 2 | 2 | 1
注意:我必须修改您的示例数据,以便用户 3
的作业 8
的日期在 30-60 天内,因为情况并非如此您的原始数据)。
您可以独立运行子查询来查看它返回的内容:
user_id | cnt_jobs_unfinished | cnt_jobs_unfinished_30d | cnt_jobs_unfinished_31_60d ------: | ------------------: | ----------------------: | -------------------------: 1 | 0 | 0 | 0 2 | 1 | 1 | 0 3 | 1 | 0 | 1 4 | 0 | 0 | 0 5 | 1 | 1 | 0
关于mysql - 根据日期查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58793947/