[英]SQL Query - select all from one table with matching records in another
[英]select items from one table with sum of records matching HAVING in subquery
我有一張桌子,上面有人口,緯度和經度。 我也有一張包含各種信息(包括緯度和經度)的機場表。
這樣的查詢大致可得出給定緯度和經度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。
您有一種非常程序性的方式來思考這一點,這在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,該MySQL包括內置的空間函數和數據類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.