前两个查询运行正常,第三个查询运行但在应该有结果时没有回复。我怎样才能获得第三个结果。在我看来GROUP BY
和HAVING
没有合作。
第二个查询返回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;
答案 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
,只使用一个位置,因为您没有进行分组。