2016-09-09 19 views
2

私は都市のテーブルを持ち、人口、緯度および経度を持っています。私はまた、緯度と経度を含む様々な情報を持つ空港のテーブルを持っています。上記でサブクエリにHAVINGと一致するレコードの合計を持つ1つのテーブルからアイテムを選択

cty_population_total 
6541221 

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 

これは、このような結果を与える:

このようなクエリは概ね所定の緯度と経度の100キロ内の全ての都市の人口を取得しますクエリ、37.61899948は緯度であり、-122.37500000は経度です。

私の質問は:空港テーブルから任意の数の空港を選択し、上記の数字の代わりにこのサブクエリに経度と緯度を渡し、各空港から100km以内の都市人口を見つけることができますか?理想的には次のような結果が得られます。

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のチップをありがとう。 1つの注記:上記は人口の合計を返すようには見えません。むしろ、空港近くのすべての都市の人口を個別に返します。 – suzerain

+1

私はc.cty_populationの周りにSUMを追加し、GROUP BY空港IDを追加することでそれを達成したようです。 – suzerain

+0

更新:私は 'a.name'でグループ分けしています。これは重複しているように見えるかもしれませんが、集約されていないすべての表示列をグループに含めることをお勧めします。 – apokryfos

関連する問題