如何在MySQL中使用GROUP BY和HAVING

3
第一和第二个查询没有问题,第三个查询运行了但是没有返回结果,而实际上应该有结果的。我应该如何让第三个查询返回结果呢?在我看来,GROUP BYHAVING好像不能很好地配合使用。
第二个查询返回32个“Active”状态和7个“Pending”状态,因此第三个查询应该返回第二个查询的总结,但它并没有。
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;

第二个应该使用 WHEREHAVING 仅用于聚合。 - AdamMc331
3个回答

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

0

在这个例子中,您不能使用HAVING,因为该子句用于指定聚合列上的条件

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

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


0
我假设第三个目标是找到2英里内MLS条目的总数。
你遇到的问题是在最终查询中按状态分组之前,先对纬度和经度进行计算。因此,每个状态分组只计算一个记录的纬度和经度。
尝试将查询#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 并只使用 where,因为您没有进行分组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接