[英]Querying multiple MySQL tables based on distinct values, and return the matches count and time difference between first and last record
我需要选择表中列slug
所有不同值,然后遍历其他多个表,并为每次计数出现slug
的记录,并找出第一次和最后一次出现之间的天数差异。
假设一个表包含对项目的引用,以及包含这些项目中的每一个的定时记录的附加表。 让我们以设备为例,结合不同时间的 CPU、RAM 和 GPU 使用指标记录,基于每个设备。
+---------------------------+-----------------------------+-----------------------------+---------------------------------+
| Table `devices` | Table `cpu` | Table `ram` | Table `gpu` |
+---------------------------+-----------------------------+-----------------------------+---------------------------------+
| slug (varchar, prim. key) | slug (varchar, prim. key) | slug (varchar, prim. key) | slug (varchar, prim. key) |
+---------------------------+-----------------------------+-----------------------------+---------------------------------+
| created (timestamp) | time (timestamp, prim. key) | date (timestamp, prim. key) | log_time (timestamp, prim. key) |
+---------------------------+-----------------------------+-----------------------------+---------------------------------+
| 30d_users (int) | cpu_use (float) | ram_use (float) | gpu_use (float) |
+---------------------------+-----------------------------+-----------------------------+---------------------------------+
| 7d_users | | | |
+---------------------------+-----------------------------+-----------------------------+---------------------------------+
为了这个例子,让我们在这些上填充一些值:
+---------+---------------------+-----------+----------+
| slug | created | 30d_users | 7d_users |
+---------+---------------------+-----------+----------+
| desktop | 2021-02-18 05:10:04 | 1982 | 713 |
+---------+---------------------+-----------+----------+
| laptop | 2021-02-16 05:10:04 | 1783 | 449 |
+---------+---------------------+-----------+----------+
| tablet | 2021-02-19 05:10:04 | 119 | 8 |
+---------+---------------------+-----------+----------+
| phone | 2021-02-27 05:10:04 | 2263 | 1567 |
+---------+---------------------+-----------+----------+
+-----------------------------------------+---+-----------------------------------------+---+-----------------------------------------+
| CPU Table | • | RAM Table | • | GPU Table |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| slug | time | cpu_use | • | slug | date | ram_use | • | slug | log_time | gpu_use |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| tablet | 2021-03-14 05:10:06 | 72 | • | desktop | 2021-03-14 05:10:06 | 57 | • | phone | 2021-03-14 05:10:06 | 64 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| phone | 2021-03-14 05:10:07 | 33 | • | laptop | 2021-03-14 05:10:07 | 84 | • | desktop | 2021-03-14 05:10:07 | 48 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| laptop | 2021-03-15 05:10:04 | 93 | • | tablet | 2021-03-14 05:10:04 | 31 | • | laptop | 2021-03-15 05:10:04 | 51 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| desktop | 2021-03-16 05:10:05 | 31 | • | phone | 2021-03-14 05:10:05 | 64 | • | desktop | 2021-03-15 05:10:05 | 29 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| tablet | 2021-03-16 05:10:05 | 47 | • | desktop | 2021-03-16 05:10:05 | 90 | • | phone | 2021-03-15 05:10:05 | 82 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| phone | 2021-03-16 05:10:06 | 37 | • | tablet | 2021-03-16 05:10:06 | 84 | • | phone | 2021-03-16 05:10:06 | 71 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| laptop | 2021-03-16 05:10:07 | 28 | • | laptop | 2021-03-16 05:10:07 | 98 | • | laptop | 2021-03-16 05:10:07 | 76 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| phone | 2021-03-17 05:10:06 | 94 | • | desktop | 2021-03-17 05:10:06 | 28 | • | phone | 2021-03-17 05:10:06 | 79 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| desktop | 2021-03-17 05:10:07 | 87 | • | phone | 2021-03-17 05:10:07 | 17 | • | desktop | 2021-03-17 05:10:07 | 34 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| tablet | 2021-03-17 05:10:08 | 93 | • | tablet | 2021-03-17 05:10:08 | 67 | • | tablet | 2021-03-17 05:10:08 | 38 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| laptop | 2021-03-17 05:10:09 | 54 | • | laptop | 2021-03-17 05:10:09 | 96 | • | laptop | 2021-03-17 05:10:09 | 95 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| desktop | 2021-03-18 05:10:07 | 21 | • | tablet | 2021-03-18 05:10:07 | 50 | • | tablet | 2021-03-18 05:10:07 | 32 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| laptop | 2021-03-18 05:10:08 | 17 | • | laptop | 2021-03-18 05:10:08 | 30 | • | laptop | 2021-03-18 05:10:08 | 27 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| tablet | 2021-03-19 05:10:08 | 42 | • | tablet | 2021-03-19 05:10:08 | 79 | • | tablet | 2021-03-19 05:10:08 | 26 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| phone | 2021-03-19 05:10:09 | 30 | • | phone | 2021-03-19 05:10:09 | 80 | • | tablet | 2021-03-19 05:10:09 | 64 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| desktop | 2021-03-19 05:10:10 | 81 | • | desktop | 2021-03-19 05:10:10 | 60 | • | desktop | 2021-03-19 05:10:10 | 91 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| laptop | 2021-03-19 05:10:11 | 63 | • | laptop | 2021-03-19 05:10:11 | 71 | • | laptop | 2021-03-19 05:10:11 | 67 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| laptop | 2021-03-20 05:10:09 | 93 | • | laptop | 2021-03-20 05:10:09 | 95 | • | laptop | 2021-03-20 05:10:09 | 95 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| desktop | 2021-03-20 05:10:10 | 76 | • | phone | 2021-03-20 05:10:10 | 40 | • | phone | 2021-03-20 05:10:10 | 37 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| tablet | 2021-03-20 05:10:11 | 87 | • | tablet | 2021-03-20 05:10:11 | 61 | • | tablet | 2021-03-20 05:10:11 | 69 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| desktop | 2021-03-21 05:10:10 | 92 | • | desktop | 2021-03-21 05:10:10 | 45 | • | desktop | 2021-03-21 05:10:10 | 80 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| phone | 2021-03-22 05:10:11 | 67 | • | phone | 2021-03-22 05:10:11 | 54 | • | phone | 2021-03-24 05:10:11 | 48 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| desktop | 2021-03-22 05:10:12 | 47 | • | laptop | 2021-03-26 05:10:12 | 90 | • | tablet | 2021-03-29 05:10:12 | 22 |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
现在,假设我想运行一个通过以下方式获取摘要的查询:
devices
表中的每个slug
slug
的每个cpu
、 ram
和gpu
上的记录数time
/ date
或log_time
)slug
- table_name_diff
- table_name_count
(乘以查询的表数,上例为3)例如,以上面的示例数据为例,结果将是:
+---------+-----------+----------+-----------+----------+-----------+----------+
| slug | cpu_count | cpu_diff | ram_count | ram_diff | gpu_count | gpu_diff |
+---------+-----------+----------+-----------+----------+-----------+----------+
| desktop | 7 | 6 | 5 | 7 | 5 | 7 |
+---------+-----------+----------+-----------+----------+-----------+----------+
| laptop | 6 | 5 | 7 | 10 | 6 | 5 |
+---------+-----------+----------+-----------+----------+-----------+----------+
| tablet | 5 | 6 | 6 | 6 | 6 | 12 |
+---------+-----------+----------+-----------+----------+-----------+----------+
| phone | 5 | 8 | 5 | 8 | 6 | 10 |
+---------+-----------+----------+-----------+----------+-----------+----------+
通过查询,我设法仅针对单个表实现了这一点(但不适用于多个表,并且没有从devices
表中获取slug
值):
SELECT DISTINCT slug, DATEDIFF(MAX(time), MIN(time)) as cpu_diff, COUNT(*)
FROM cpu
GROUP BY slug
ORDER BY `cpu_diff` DESC
你在正确的轨道上!
考虑从您现有的方法构建:
WITH cpu_summary AS (
SELECT slug
, DateDiff(dd, Max(time), Min(time) AS cpu_diff
, Count(*) AS cpu_count
FROM cpu
GROUP
BY slug
)
, ram_summary AS (
<a very similar looking query to the above one, but on the ram table>
)
, gpu_summary AS (
<take a guess ;-)>
)
SELECT devices.slug
, cpu_summary.cpu_diff
, cpu_summary.cpu_count
, ram_summary.ram_diff
, ram_summary.ram_count
, gpu_summary.gpu_diff
, gpu_summary.gpu_count
FROM devices
LEFT
JOIN cpu_summary
ON cpu_summary.slug = devices.slug
LEFT
JOIN ram_summary
ON ram_summary.slug = devices.slug
LEFT
JOIN gpu_summary
ON gpu_summary.slug = devices.slug
;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.