获取 MySQL 中不同日期时间范围值的计数
Get count of distinct datetime range values in MySQL
我的 MySQL 数据库中有两个 table:
users_metrics
id | user_id | login_datetime | logout_datetime |
--------------------------------------------------.-----|
1 | 1 |2022-05-04 00:25:16 |2022-05-04 00:30:16|
-----------------------------------------------.--------|
2 | 3 |2022-05-04 10:29:16 |2022-05-04 10:40:16|
--------------------------------------------------------|
3 | 1 |2022-05-04 11:48:16 |2022-05-04 11:49:56|
--------------------------------------------------------|
4 | 3 |2022-05-04 11:58:16 |2022-05-04 12:20:16|
--------------------------------------------------------|
5 | 1 |2022-05-04 16:28:16 |2022-05-04 17:29:56|
--------------------------------------------------------|
files_uploaded
id | type | file_upload_datetime | user_id |
-----------------------------------------------
1 | csv |2022-05-04 00:29:16 | 1 |
-----------------------------------------------
2 | csv |2022-05-04 10:39:16 | 3 |
-----------------------------------------------
3 | txt |2022-05-04 11:49:16 | 1 |
-----------------------------------------------
4 | txt |2022-05-04 11:59:16 | 3 |
-----------------------------------------------
5 | csv |2022-05-04 12:09:16 | 3 |
-----------------------------------------------
6 | txt |2022-05-04 12:19:16 | 3 |
-----------------------------------------------
7 | txt |2022-05-04 16:29:16 | 1 |
-----------------------------------------------
8 | csv |2022-05-04 16:39:16 | 1 |
-----------------------------------------------
9 | txt |2022-05-04 16:49:16 | 1 |
-----------------------------------------------
10 | csv |2022-05-04 17:29:16 | 1 |
-----------------------------------------------
users_metrics
table保存某个用户的登录和注销时间和files_uploaded
table记录用户上传的文件记录。
我正在寻找一个查询,该查询允许获取第一个 table 建立的日期时间范围内的上传文件数。
这将是我正在寻找的结果的视图。
id | user_id | login_datetime | logout_datetime | total_files_uploaded
--------------------------------------------------.-----|---------------------|
1 | 1 |2022-05-04 00:25:16 |2022-05-04 00:30:16| 1
-----------------------------------------------.--------|---------------------|
2 | 3 |2022-05-04 10:29:16 |2022-05-04 10:40:16| 1
--------------------------------------------------------|---------------------|
3 | 1 |2022-05-04 11:48:16 |2022-05-04 11:49:56| 1
--------------------------------------------------------|---------------------|
4 | 3 |2022-05-04 11:58:16 |2022-05-04 12:20:16| 3
--------------------------------------------------------|---------------------|
5 | 1 |2022-05-04 16:28:16 |2022-05-04 17:29:56| 3
--------------------------------------------------------|---------------------|
您可以根据用户id和登录时间加入表格,然后统计上传:
SELECT u.user_id,
u.login_datetime,
u.logout_datetime,
coalesce(count(f.id), 0) total_files_uploaded
FROM user_metrics u
LEFT JOIN files_uploaded f
ON u.user_id = f.user_id
AND f.file_uploaded_datetime BETWEEN u.login_datetime AND u.logout_datetime
GROUP BY u.user_id, u.login_datetime, u.logout_datetime;
输出:
user_id
login_datetime
logout_datetime
total_files_uploaded
1
2022-05-04 00:25:16
2022-05-04 00:30:16
1
3
2022-05-04 10:29:16
2022-05-04 10:40:16
1
1
2022-05-04 11:48:16
2022-05-04 11:49:56
1
3
2022-05-04 11:58:16
2022-05-04 12:20:16
3
1
2022-05-04 16:28:16
2022-05-04 17:29:56
4
如果用户在登录期间没有上传任何文件,这将显示 0。如果您不想为没有上传任何文件的用户显示条目,您可以将左连接替换为内部连接并删除coalesce
.
我的 MySQL 数据库中有两个 table:
users_metrics
id | user_id | login_datetime | logout_datetime |
--------------------------------------------------.-----|
1 | 1 |2022-05-04 00:25:16 |2022-05-04 00:30:16|
-----------------------------------------------.--------|
2 | 3 |2022-05-04 10:29:16 |2022-05-04 10:40:16|
--------------------------------------------------------|
3 | 1 |2022-05-04 11:48:16 |2022-05-04 11:49:56|
--------------------------------------------------------|
4 | 3 |2022-05-04 11:58:16 |2022-05-04 12:20:16|
--------------------------------------------------------|
5 | 1 |2022-05-04 16:28:16 |2022-05-04 17:29:56|
--------------------------------------------------------|
files_uploaded
id | type | file_upload_datetime | user_id |
-----------------------------------------------
1 | csv |2022-05-04 00:29:16 | 1 |
-----------------------------------------------
2 | csv |2022-05-04 10:39:16 | 3 |
-----------------------------------------------
3 | txt |2022-05-04 11:49:16 | 1 |
-----------------------------------------------
4 | txt |2022-05-04 11:59:16 | 3 |
-----------------------------------------------
5 | csv |2022-05-04 12:09:16 | 3 |
-----------------------------------------------
6 | txt |2022-05-04 12:19:16 | 3 |
-----------------------------------------------
7 | txt |2022-05-04 16:29:16 | 1 |
-----------------------------------------------
8 | csv |2022-05-04 16:39:16 | 1 |
-----------------------------------------------
9 | txt |2022-05-04 16:49:16 | 1 |
-----------------------------------------------
10 | csv |2022-05-04 17:29:16 | 1 |
-----------------------------------------------
users_metrics
table保存某个用户的登录和注销时间和files_uploaded
table记录用户上传的文件记录。
我正在寻找一个查询,该查询允许获取第一个 table 建立的日期时间范围内的上传文件数。
这将是我正在寻找的结果的视图。
id | user_id | login_datetime | logout_datetime | total_files_uploaded
--------------------------------------------------.-----|---------------------|
1 | 1 |2022-05-04 00:25:16 |2022-05-04 00:30:16| 1
-----------------------------------------------.--------|---------------------|
2 | 3 |2022-05-04 10:29:16 |2022-05-04 10:40:16| 1
--------------------------------------------------------|---------------------|
3 | 1 |2022-05-04 11:48:16 |2022-05-04 11:49:56| 1
--------------------------------------------------------|---------------------|
4 | 3 |2022-05-04 11:58:16 |2022-05-04 12:20:16| 3
--------------------------------------------------------|---------------------|
5 | 1 |2022-05-04 16:28:16 |2022-05-04 17:29:56| 3
--------------------------------------------------------|---------------------|
您可以根据用户id和登录时间加入表格,然后统计上传:
SELECT u.user_id,
u.login_datetime,
u.logout_datetime,
coalesce(count(f.id), 0) total_files_uploaded
FROM user_metrics u
LEFT JOIN files_uploaded f
ON u.user_id = f.user_id
AND f.file_uploaded_datetime BETWEEN u.login_datetime AND u.logout_datetime
GROUP BY u.user_id, u.login_datetime, u.logout_datetime;
输出:
user_id | login_datetime | logout_datetime | total_files_uploaded |
---|---|---|---|
1 | 2022-05-04 00:25:16 | 2022-05-04 00:30:16 | 1 |
3 | 2022-05-04 10:29:16 | 2022-05-04 10:40:16 | 1 |
1 | 2022-05-04 11:48:16 | 2022-05-04 11:49:56 | 1 |
3 | 2022-05-04 11:58:16 | 2022-05-04 12:20:16 | 3 |
1 | 2022-05-04 16:28:16 | 2022-05-04 17:29:56 | 4 |
如果用户在登录期间没有上传任何文件,这将显示 0。如果您不想为没有上传任何文件的用户显示条目,您可以将左连接替换为内部连接并删除coalesce
.