【问题标题】:Retrieving data from joined MySQL tables using an AVG in the WHERE clause?在 WHERE 子句中使用 AVG 从连接的 MySQL 表中检索数据?
【发布时间】:2011-05-23 04:48:08
【问题描述】:

我正在尝试从在 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。

我需要帮助来编写正确的查询,以按照我的描述进行。如果需要,我可以澄清。 感谢您的帮助!

【问题讨论】:

  • 感谢编辑。看起来有点长。

标签: mysql average


【解决方案1】:

您所写的查询存在几个问题。我对所有表的结构并不完全清楚,但我相信我根据您发布的查询理解了要点。您发布的查询的第一个问题是您没有在使用 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

【讨论】:

  • 好的,谢谢!我最初发布的查询是一个复制和粘贴的噩梦,我知道它与它本应如此相去甚远。我终于放弃并发布了我所拥有的。
  • 好吧,经过一番睡眠和玩弄它,它并没有完全按照我的希望进行(虽然它已经接近了!)。让我再澄清一点:您上面的查询仅从 company_metrics 表中获取 3 家公司。我想要的是它获取每一个 company_metric,然后对每家公司的最新 3 个 company_unique_visitors 行进行平均。换句话说:获取所有 company_metrics 按该公司最近 3 个 company_unique_visitors 行的 AVG 对它们进行排序,并返回 company_unique_visitors 大于 2000 的任何行。我希望这是有道理的。 :)
  • 我根据您的询问回答了自己。再次感谢!
【解决方案2】:

好的,基于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 的所有帮助!

【讨论】:

    猜你喜欢
    • 2016-04-05
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    相关资源
    最近更新 更多