2016-09-09 78 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

相关问题