sql >> データベース >  >> RDS >> Mysql

場所を取り巻く郊外のリストを取得し、MySqlを使用して他の場所について繰り返すにはどうすればよいですか?

    自己参加を実行する必要があります。 参加 テーブルは非常に SQLの基本的な部分-あなたは本当に この答えをさらに理解しようとする前に、それを読んでおく必要があります。

    SELECT   poi.asciiname,
             suburb.asciiname,
             suburb.country,
             DEGREES(
               ACOS(
                 SIN(RADIANS(   poi.latitude))
               * SIN(RADIANS(suburb.latitude))
               + COS(RADIANS(   poi.latitude))
               * COS(RADIANS(suburb.latitude))
               * COS(RADIANS(poi.longitude - suburb.longitude))
               )
             ) * 60 * 1.852 AS distance
    FROM     geoname AS poi
        JOIN geoname AS suburb
    WHERE    poi.asciiname IN ('Tamworth', 'Birmingham', 'Roanoke')
         AND poi.population > 0
         AND poi.fcode = 'PPL'
         AND suburb.fcode IN ('PPLX', 'PPPL')
    HAVING   distance <= 60
    ORDER BY poi.asciiname, distance
    

    sqlfiddle でご覧ください 。

    MySQLのIN() value = A OR value = B OR ...の省略形としての演算子 。

    また、MySQLのDEGREES() および RADIANS() そのような変換を明示的に実行しようとするのではなく、機能します。

    次に、緯度の分に1.851999999962112の係数を掛けていました。 、これはかなり奇妙でした。1.852に非常に近いです。 、これは海里の正確なキロメートル数(歴史的には緯度の1分として定義されています)ですが、奇妙なことにわずかに異なります。代わりにそれを使用するつもりだったと思います。

    最後に、結果セット内の距離を文字列としてフィルタリングするためのリテラル値があります。つまり、'60' 、これは明らかに数値であり、引用符で囲まないようにする必要があります。



    1. 予期しないT_ENCAPSED_AND_WHITESPACE、T_STRINGまたはT_VARIABLEまたはT_NUM_STRINGエラーが予想されます

    2. エラー1452:子行を追加または更新できません:外部キー制約が失敗します

    3. postgresqlへのdictオブジェクトの追加

    4. 同じテーブルに複数回参加する