从一个表中选择具有与子查询中的HAVING匹配的记录总和的项目

时间:2016-09-09 08:16:46

标签: mysql sql 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。

1 个答案:

答案 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,其中包括内置的空间函数和数据类型。