簡體   English   中英

從一個表中選擇項,且記錄的總和與子查詢中的HAVING相匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM