我有一张城市表,其中包括人口,纬度和经度。我还有一张机场表,其中包含各种信息,包括纬度和经度。
这样的查询大致得出了给定纬度和经度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 :(得分: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,其中包括内置的空间函数和数据类型。