如何在MySQL中使用GROUP By和HAVING

时间:2015-07-02 17:16:48

标签: mysql group-by having

前两个查询运行正常,第三个查询运行但在应该有结果时没有回复。我怎样才能获得第三个结果。在我看来GROUP BYHAVING没有合作。

第二个查询返回32个活动状态和7个待处理状态,因此第三个查询应返回第二个查询的摘要,但不是。

SELECT COUNT(DISTINCT MLSNumber) AS TOTAL, `Status`
FROM Residential 
WHERE PropertyType='Single Family' AND Status IN ("Active", "Pending")  
GROUP BY `Status`;

SELECT MLSNumber, `Status`, 
( 3959 * acos( cos( radians(21.380936) ) * cos( radians( Latitude ) ) 
 * cos( radians( Longitude ) - radians(-157.757438) ) + sin( radians(21.380936) ) 
 * sin(radians(Latitude)) ) ) AS distance 
FROM Residential 
WHERE PropertyType='Single Family' AND Status IN ("Active", "Pending")  
HAVING distance < 2;

SELECT COUNT(DISTINCT MLSNumber) AS TOTAL, `Status`, 
( 3959 * acos( cos( radians(21.380936) ) * cos( radians( Latitude ) ) 
 * cos( radians( Longitude ) - radians(-157.757438) ) + sin( radians(21.380936) ) 
 * sin(radians(Latitude)) ) ) AS distance 
FROM Residential 
WHERE PropertyType='Single Family' AND Status IN ("Active", "Pending")  
GROUP BY `Status`
HAVING distance < 2;

3 个答案:

答案 0 :(得分:2)

当您使用GROUP BY时,您需要对GROUP BY子句中未包含的所有字段使用聚合函数。

我认为你想要的是让计算出的距离成为你的where子句的一部分,并摆脱HAVING子句。

WHERE PropertyType='Single Family' AND Status IN ("Active", "Pending")  
    AND ( 3959 * acos( cos( radians(21.380936) ) * cos( radians( Latitude ) ) * cos( radians( Longitude ) - radians(-157.757438) ) + sin( radians(21.380936) ) * sin(radians(Latitude)) ) ) < 2

答案 1 :(得分:0)

您不能在此示例中使用HAVING,因为该子句用于specifying conditions on aggregate columns

在您的示例中,distance不是聚合列,而是为每行计算的聚合列,因此如果要查找距离小于2的行,则应使用WHERE子句。但是,我不确定你是否想要在这种情况下进行分组,因为距离看起来适用于单个行,而不适用于该组。

这些示例中唯一属于HAVING的列是您的计数函数。

答案 2 :(得分:0)

我假设#3的目标是找到2英里内MLS条目的总数。

您遇到的问题是,在最终查询中按Status进行分组后,您首先应用该值,然后再对纬度和经度进行计算。因此,每个Status分组的组只计算一个记录的纬度和经度。

尝试将查询#2包装在按状态分组的另一个选择中:

  SELECT COUNT(DISTINCT i.MLSNumber) AS TOTAL, i.Status FROM 
    ( SELECT MLSNumber, `Status`, 
         ( 3959 * acos( cos( radians(21.380936) ) * cos( radians( Latitude ) ) *    cos( radians( Longitude ) - radians(-157.757438) ) + sin( radians(21.380936) ) * sin(radians(Latitude)) ) ) AS distance 
     FROM Residential 
     WHERE PropertyType='Single Family' AND Status IN ("Active", "Pending")  
     HAVING distance < 2) as i  Group by Status

您可能需要稍微调整一下查询,但这就是要点 - 我没有您的架构进行试验。

此外,正如对您之前发布的帖子的评论所指出的那样,您可以放弃HAVING,只使用一个位置,因为您没有进行分组。