2016-09-09 80 views
2

我有一個城市的表格,其中包括人口,經度和緯度。我也有一張機場的表格,裏面有各種信息,包括經度和緯度。從一個表中選擇項目與記錄匹配的子項中的HAVING

這樣的查詢大致獲得一個給定的緯度和經度爲100公里之內的所有城鎮的人口:

SELECT SUM(cty_population) as cty_population_total FROM 
(SELECT 
    cty_population, (
    6371 * acos (
     cos (radians(37.61899948)) 
     * cos(radians(cty_latitude)) 
     * cos(radians(cty_longitude) - radians(-122.37500000)) 
     + sin (radians(37.61899948)) 
     * sin(radians(cty_latitude)) 
    ) 
) AS cty_distance 
FROM cities 
HAVING cty_distance < 100) cty_population_alias 

這會給這樣的結果:

cty_population_total 
6541221 

在上述查詢,37.61899948是緯度和-122.37500000是經度。

我的問題是:我可以從機場表中選擇任意數量的機場,將它們的經度和緯度傳遞到這個子查詢中以代替上述數字,並且找到每個機場100公里範圍內的城市人口。理想情況下,我會有這樣的結果:

airport_name  airport_pop  
Boston Logan   6654901 
London Heathrow  11345690 

...等。

我可以用腳本來做到這一點,但我想知道是否可以單獨使用SQL來完成?數據庫引擎是MySQL。

+0

你有什麼用'HAVING'取代'的理由。那裏呢? – apokryfos

+0

WHERE拋出錯誤:「'where子句'」中的未知列'cty_distance'。據我所知,你必須使用HAVING和別名。 – suzerain

+0

看到一個沒有GROUP BY的'HAVING'只是很奇怪我會親自做一些像'WHERE(距離計算)<100'的東西,但那只是我。 – apokryfos

回答

0

您有一種非常程序化的方式來思考這在SQL中不能很好地工作。你可以把它想象成與附近的所有機場一起加入城市。

下可以正常工作:

SELECT a.name, SUM(c.cty_population) 
FROM cities c JOIN airports a ON (
6371 * acos (
    cos (radians(a.latitude)) 
    * cos(radians(c.cty_latitude)) 
    * cos(radians(c.cty_longitude) - radians(a.longitude)) 
    + sin (radians(a.latitude)) 
    * sin(radians(c.cty_latitude)) 
) < 100 
WHERE (filter airports or something else here) 
GROUP BY a.airport_id, a.name 

另外,我建議你遷移到MySQL 5.7,其中包括內置的空間函數和數據類型

+0

感謝您的回覆和5.7提示。一個注意:上述似乎沒有返回人口總和。相反,它會單獨返回機場附近的所有城市人口。 – suzerain

+1

我似乎已經通過在c.cty_population周圍添加SUM並添加GROUP BY機場ID來實現它。 – suzerain

+0

更新:我也通過'a.name'進行分組,這看起來可能是多餘的,但建議在分組中包含所有非聚合顯示列。 – apokryfos

相關問題