问题描述
|
我试图从使用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的所有帮助!