微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用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的所有帮助!     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?