2016-07-22 14 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

只是分享你想要的結果..更多細節.. image如果posiible –

回答

1

怎麼樣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(也許添加datetimeip)爲每個表的索引。

+0

你也有一個解決方案,包括所有server_log_4,_5,_6表在將來自動形成的查詢嗎? – Tarik

+0

@Tarik。 。 。我建議你調查表分區,但這是超出這個問題的範圍。 –

相關問題