将具有相同列的不同 MySQL 表上的数据组合并合并到唯一行中并 运行 对其进行查询

Combining and merging data on different MySQL tables with the same columns into unique rows and running query to it

这是我 运行 分析 MySQL 数据库上的服务器日志的代码:

SELECT YEAR(datetime), MONTH( datetime ), MIN(DATE(datetime)), MAX(DATE(datetime)), COUNT(DISTINCT (ip)), COUNT(ip), (COUNT(ip) / COUNT(DISTINCT (ip))) AS Ratio
FROM  `server_log_1` 
WHERE  `state` LIKE  'action'
AND  `user_id` LIKE  '9'
GROUP BY MONTH( datetime )
UNION
SELECT YEAR(datetime), MONTH( datetime ), MIN(DATE(datetime)), MAX(DATE(datetime)), COUNT(DISTINCT (ip)), COUNT(ip), (COUNT(ip) / COUNT(DISTINCT (ip))) AS Ratio
FROM  `server_log_2` 
WHERE  `state` LIKE  'action'
AND  `user_id` LIKE  '9'
GROUP BY MONTH( datetime )
UNION
SELECT YEAR(datetime), MONTH( datetime ), MIN(DATE(datetime)), MAX(DATE(datetime)), COUNT(DISTINCT (ip)), COUNT(ip), (COUNT(ip) / COUNT(DISTINCT (ip))) AS Ratio
FROM  `server_log_3` 
WHERE  `state` LIKE  'action'
AND  `user_id` LIKE  '9'
GROUP BY MONTH( datetime )

这给了我结果:

YEAR(datetime)  MONTH( datetime )   MIN(DATE(datetime)) MAX(DATE(datetime)) COUNT(DISTINCT (ip))    COUNT(ip)   Ratio
2015                12              2015-12-14              2015-12-30              16              20              1.2500
2016                1               2016-01-05              2016-01-27              15              20              1.3333
2016                2               2016-02-02              2016-02-29              27              36              1.3333
2016                3               2016-03-04              2016-03-29              24              32              1.3333
2016                4               2016-04-01              2016-04-08              5               8               1.6000
2016                4               2016-04-09              2016-04-29              19              27              1.4211
2016                5               2016-05-02              2016-05-28              21              31              1.4762
2016                6               2016-06-01              2016-06-30              28              34              1.2143
2016                7               2016-07-01              2016-07-20              14              16              1.1429
2016                7               2016-07-21              2016-07-21              1               1               1.0000

这些是每个数据库的准确结果,但是您会看到当一个月分为 2 个不同的数据库时(例如 2016-4 和 2016-7),这会导致为该月生成 2 个不同的行。

我希望将这些行生成为单行,其中包含相应月份的值的总和。 (每月只有一行)

此外,尽可能简化查询。

我会在 2016-12 之后遇到麻烦,因为按月分组将合并 2015-12 和 2016-12 的数据。我怎样才能避免这个问题呢?

你能写出正确的 SQL 语句吗?

group by 之前做 union all 怎么样:

SELECT YEAR(datetime), MONTH(datetime), MIN(DATE(datetime)), MAX(DATE(datetime)), COUNT(DISTINCT (ip)), COUNT(ip), (COUNT(ip) / COUNT(DISTINCT (ip))) AS Ratio
FROM (
    (SELECT datetime, ip FROM server_log_1 WHERE state = 'action' AND user_id = 9) UNION ALL
    (SELECT datetime, ip FROM server_log_2 WHERE state = 'action' AND user_id = 9) UNION ALL
    (SELECT datetime, ip FROM server_log_3 WHERE state = 'action' AND user_id = 9) 
) AS table_all
GROUP BY YEAR(datetime), MONTH(datetime);

在性能方面,您希望 state, user_id 上的每个 table 都有一个索引(并且可能添加 datetimeip)。