2016-07-22 5 views
0

Вот код, который я бег анализировать логи сервера на базе MySQL:Объединения и объединения данных на разных таблицах 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, пожалуйста?

+0

просто делят полученный результат. Подробнее .. изображение, если возможно –

ответ

1

Как о выполнении union all перед group by:

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 (и, возможно, добавление datetime и ip).

+0

Также есть ли у вас решение включить все таблицы server_log_4, _5, _6, сформированные в будущем, автоматически в запросе? – Tarik

+0

@Tarik. , , Я бы рекомендовал вам изучить разбиение таблиц, но это выходит за рамки этого вопроса. –

 Смежные вопросы

  • Нет связанных вопросов^_^