mysql - 根据日期查询

标签 mysql

我有下表/数据(示例)

用户

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 

<强> Demo on DB Fiddle

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/

相关文章:

php - Mysql 图片库,包含下一个和上一个

MySQL 乘法输出和 Perl DBI

mysql - 设计 XtraDB 集群

PHP 数据验证/输入安全

java - Spring Data JPA连接2个表

mysql - SQL - 连接表 - 如果不匹配则返回 null

mysql - MySql中有递归存储过程吗?

php - 选择不同的通知并准备更清晰的通知消息

MySql 循环每一行进行计算

javascript - 如何使用 AJAX 在点击保存时向表中添加记录?