2011-06-22 167 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