2011-06-22 138 views
3

我有这个疑问:数查询返回意外的结果

SELECT 
    count(*) as count , 
    (3959 * acos(
     cos(radians(37.774929)) * cos(radians(lat)) * cos(radians(lng) - radians(-122.419418)) 
     + sin(radians(37.774929)) * sin(radians(lat)) 
    )) AS distance 
FROM users 
HAVING distance < 150 

我认为这是要给我是谁在150英里半径的用户的数量。但相反,它给了我的用户总数。如果lat/lng不同,那么当有一些用户在那里时,它会给我零用户的数量。

任何想法如何改变这个查询,以获得150米范围内的用户数量?

谢谢!

+0

+1来自@Dirk和@Dems的回答。我的补充评论是:HAVING不是与访问别名的地方。 :-) –

回答

6

你想使用WHERE子句

select count(*) as count from users WHERE (3959 * acos(cos(radians(37.774929)) * cos(radians(lat)) * cos(radians(lng) - radians(-122.419418)) + sin(radians(37.774929)) * sin(radians(lat)))) < 150 
3

为了扩大对德克的回答......

  • WHERE子句应用于记录后,他们都被加入了。
  • 任何聚合完成后应用HAVING子句。

此外,在德克的回答,你不必须的选择计算,以便能够在其他地方使用它。

因此,Dirk的答案会计算每个ROW(在连接之前,聚合之前)的距离,然后丢弃距离为150或更多的距离。它只是那么聚合和统计一切。

+0

谢谢,我应该多解释一些事情。 – Dirk

+0

嗯,你让我有10代表不解释它,所以谢谢:) – MatBailie