2012-09-19 4 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

이 당신이 원하는 것 같다 ... 같은 것입니다. 나는 그들이 stats_host 필드에 LEFT JOIN를 통해 가입 된 추가 두 쿼리에 대해 다음 적절한 ANSI 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

관련 문제