【问题标题】:How to use GROUP By and HAVING in MySQL如何在 MySQL 中使用 GROUP By 和 HAVING
【发布时间】:2015-07-02 17:16:47
【问题描述】:

前两个查询工作正常,第三个运行但应该有结果时什么也没带回来。我怎样才能得到第三个带回结果。在我看来,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;

【问题讨论】:

  • 第二个应该使用WHEREHAVING 仅用于聚合。

标签: mysql group-by having


【解决方案1】:

当您使用 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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      我假设 #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 并只使用 where ,因为您没有分组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-28
        相关资源
        最近更新 更多