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

问题描述

| 我试图从使用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的AVG不会大于2000。 我需要帮助编写正确的查询以按照我的描述进行操作。我可以澄清是否需要。 谢谢你的帮助!     

解决方法

您编写的查询存在几个问题。我对所有表的结构尚不完全清楚,但我相信我根据您发布的查询了解要点。发布的查询的第一个问题是您没有在使用HAVING子句的查询中进行分组或使用任何聚合。您可以在其中一个子查询中使用聚合,但是现在在何处使用HAVING并没有多大意义。 我相信您要先对company_id进行分组,然后再进行平均值汇总,因此我在外部查询中将其作为主要分组依据。您还使用过多的嵌套查询来完成看似简单的任务,即仅选择三个最新的度量值。我将该子查询移到了主联接中,以便仅以逻辑方式选择一次数据。 而且,无需进一步的仪式,这是固定的查询:
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
    ,确定基于Jared Harding的回答和这篇文章:移动平均-MySQL 我能够找出查询。
SELECT metrics.*,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的所有帮助!     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...