2012-09-19 41 views
1

我想将同一个表的不同结果合并为一个大的结果。mysql加入同一个表的不同结果集

SELECT host_name,stats_avgcpu,stats_avgmem,stats_avgswap,stats_avgiowait 
    FROM sar_stats,sar_hosts,sar_appgroups,sar_environments 
    WHERE stats_host = host_id 
    AND host_environment = env_id 
    AND env_name = 'Staging 2' 
    AND host_appgroup = group_id 
    AND group_name = 'Pervasive' 
    AND DATE(stats_report_time) = DATE_SUB(curdate(), INTERVAL 1 DAY) 

SELECT AVG(stats_avgcpu),AVG(stats_avgmem),AVG(stats_avgswap),AVG(stats_avgiowait) 
FROM sar_stats 
WHERE stats_id = "stat_id of the first query" and DATE(stats_report_time) 
    BETWEEN DATE_SUB(curdate(), INTERVAL 8 DAY) and DATE_SUB(curdate(), INTERVAL 1 DAY) 

SELECT AVG(stats_avgcpu),AVG(stats_avgmem),AVG(stats_avgswap),AVG(stats_avgiowait) 
FROM sar_stats 
WHERE stats_id = "stat_id of the first query" and DATE(stats_report_time) 
    BETWEEN DATE_SUB(curdate(), INTERVAL 31 DAY) and DATE_SUB(curdate(), INTERVAL 1 DAY) 

所需的输出会是这样的......

host_name|stats_avgcpu|stats_avgmem|stats_avgswap|stats_avgiowait|7daycpuavg|7daymemavg|7dayswapavg|7dayiowaitavg|30daycpuavg|30daymemavg|....etc 

SQL小提琴 http://sqlfiddle.com/#!8/4930b/3

+2

如果你创建了一个工作会更容易使用[SQL Fiddle](http://sqlfiddle.com/)中的DDL和DML模型。在这一点上,我们无法知道每个表格会发送什么数据。如果你不创建一个sql小提琴,那么至少要提供表结构和示例数据。 – Taryn

回答

2

好像这是你想要的。我更新了第一次查询中使用适当的ANSI JOIN语法,然后为他们的stats_host场通过LEFT JOIN加入了额外的两个查询:

SELECT s.stats_host, 
    h.host_name, 
    s.stats_avgcpu, 
    s.stats_avgmem, 
    s.stats_avgswap, 
    s.stats_avgiowait, 
    s7.7dayavgcpu, 
    s7.7dayavgmem, 
    s7.7dayavgswap, 
    s7.7dayavgiowait, 
    s30.30dayavgcpu, 
    s30.30dayavgmem, 
    s30.30dayavgswap, 
    s30.30dayavgiowait 
FROM sar_stats s 
INNER JOIN sar_hosts h 
    on s.stats_host = h.host_id 
INNER JOIN sar_appgroups a 
    on h.host_appgroup = a.group_id 
    and a.group_name = 'Pervasive' 
INNER JOIN sar_environments e 
    on h.host_environment = e.env_id 
    and e.env_name = 'Staging 2' 
LEFT JOIN 
(
    SELECT s.stats_host, 
    AVG(s.stats_avgcpu) AS '7dayavgcpu', 
    AVG(s.stats_avgmem) AS '7dayavgmem', 
    AVG(s.stats_avgswap) AS '7dayavgswap', 
    AVG(s.stats_avgiowait) AS '7dayavgiowait' 
    FROM sar_stats s 
    WHERE DATE(stats_report_time) BETWEEN DATE_SUB(curdate(), INTERVAL 8 DAY) AND DATE_SUB(curdate(), INTERVAL 1 DAY) 
    GROUP BY s.stats_host 
) s7 
    on s.stats_host = s7.stats_host 
LEFT JOIN 
(
    SELECT s.stats_host, 
    AVG(s.stats_avgcpu) AS '30dayavgcpu', 
    AVG(s.stats_avgmem) AS '30dayavgmem', 
    AVG(s.stats_avgswap) AS '30dayavgswap', 
    AVG(s.stats_avgiowait) AS '30dayavgiowait' 
    FROM sar_stats s 
    WHERE DATE(s.stats_report_time) BETWEEN DATE_SUB(curdate(), INTERVAL 31 DAY) AND DATE_SUB(curdate(), INTERVAL 1 DAY) 
    GROUP BY s.stats_host 
) s30 
    on s.stats_host = s30.stats_host 
WHERE DATE(s.stats_report_time) = DATE_SUB(curdate(), INTERVAL 1 DAY); 

看到SQL Fiddle with Demo