mysql连接同一个表不同的结果集

标签 mysql sql join union

我想将同一个表中的不同结果合并为一个大结果。

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 fiddle http://sqlfiddle.com/#!8/4930b/3

最佳答案

看来这就是你想要的。我更新了第一个查询以使用正确的 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

关于mysql连接同一个表不同的结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12499863/

相关文章:

mysql - 在 Material list 中插入父项目的销售价格而不重复

sql - 仅使用最小 COUNT() 转置行和列(又名枢轴)?

来自两个表的具有相同名称的mysql额外列

php - mysql 中主表(联合)及其左表的计数、求和

html - 复选框组可以识别重复区域结果吗?

MYSQL周五分组做报告

php - 取消设置 mysql 结果

MySQL - 将单词添加到文本列的末尾

sql - 存储过程运行速度比查询慢很多

R-合并两个数据框,但某些值中有分号