使用WHERE子句中的AVERAGE从连接MySQL表中检索数据?

时间:2011-05-23 04:48:09

标签: mysql average

我正在尝试从WHERE子句中使用AVG的多个表中选择数据。

SELECT company_metrics.*, companies.company_name, companies.permalink 
FROM company_metrics LEFT JOIN companies 
     ON companies.company_id = company_metrics.company_id
WHERE MONTH(date) = '04' AND YEAR(date) = '2011' 
HAVING (SELECT avg(company_unique_visitors) 
        FROM (SELECT company_metrics.company_unique_visitors 
              FROM company_metrics  
              ORDER BY company_metrics.date DESC LIMIT 3)
        average ) >'2000' 
ORDER BY date DESC

示例数据:

###Company Metrics#### Table
company_id       company_unique_visitors       date
-----------      -----------------------       ----
     604                    2054               2011-04-01
     604                    3444               2011-03-01
     604                    2122               2011-02-01
     604                    2144               2011-01-01
     604                    2001               2010-12-01
     602                    2011               2011-04-01
     602                    11                 2011-03-01
     602                    411                2011-02-01
     602                    611                2011-01-01
     602                    111                2010-12-01

修改 我想只有来自company_unique_visitors AVG'ed的3个最新号码 的 /修改

因此查询将选择company_id 604,但它不会选择company_id 602,因为602没有大于2000的AVG。

我需要帮助编写正确的查询来执行我所描述的操作。如果需要,我可以澄清一下。 谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

您的查询存在一些问题。我并不完全清楚所有表格的结构,但我相信我会根据您发布的查询理解要点。发布的查询的第一个问题是,您不是在使用HAVING子句的查询中进行分组或使用任何聚合。您在其中一个子查询中使用聚合,但现在它的HAVING没有多大意义。

我相信在你做出平均值的总和之前你想通过company_id进行分组,所以我在外部查询中将其作为主要组。您还使用了太多嵌套查询来完成仅选择最近3次测量的看似简单的任务。我将该子查询移动到主连接中,以便仅以逻辑方式选择一次数据。

而且,没有进一步的仪式,这是固定的查询:

SELECT limited_metrics.*, companies.company_name, companies.permalink,
       avg(limited_metrics.company_unique_visitors) AS avg_visitors 
FROM 
  (SELECT *
   FROM company_metrics
   ORDER BY company_metrics.date DESC LIMIT 3) AS limited_metrics
  LEFT JOIN companies 
  ON companies.company_id = limited_metrics.company_id
WHERE MONTH(limited_metrics.date) = '04' AND YEAR(limited_metrics.date) = '2011'
GROUP BY companies.company_id
HAVING avg_visitors > 2000

答案 1 :(得分:0)

好的基于Jared Harding的答案和帖子:Moving average - MySQL 我能够找出查询。

SELECT metrics.*,companies.company_name,companies.permalink
FROM (SELECT company_id,AVG(company_unique_visitors) AS met_avg
      FROM company_metrics
     WHERE `date` BETWEEN DATE_SUB(NOW(), INTERVAL 4 MONTH) AND NOW()
  GROUP BY company_id HAVING met_avg>2000) AS metrics
LEFT JOIN companies ON companies.company_id=metrics.company_id

感谢Jared的所有帮助!