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

mySQLは、yの範囲内のxkm/マイル以内の郵便番号を選択します

    Haversine式 と呼ばれるものを使用する必要があります :

    $sql = "
        SELECT zipcode
        FROM zipcodes
        WHERE ".mysqlHaversine($lat, $lon, $distance)."
    ";
    

    そして式:

    function mysqlHaversine($lat = 0, $lon = 0, $distance = 0)
    {
        if($distance > 0)
        {
            return ('
            ((6372.797 * (2 *
            ATAN2(
                SQRT(
                    SIN(('.($lat*1).' * (PI()/180)-latitude*(PI()/180))/2) *
                    SIN(('.($lat*1).' * (PI()/180)-latitude*(PI()/180))/2) +
                    COS(latitude * (PI()/180)) *
                    COS('.($lat*1).' * (PI()/180)) *
                    SIN(('.($lon*1).' * (PI()/180)-longitude*(PI()/180))/2) *
                    SIN(('.($lon*1).' * (PI()/180)-longitude*(PI()/180))/2)
                    ),
                SQRT(1-(
                    SIN(('.($lat*1).' * (PI()/180)-latitude*(PI()/180))/2) *
                    SIN(('.($lat*1).' * (PI()/180)-latitude*(PI()/180))/2) +
                    COS(latitude * (PI()/180)) *
                    COS('.($lat*1).' * (PI()/180)) *
                    SIN(('.($lon*1).' * (PI()/180)-longitude*(PI()/180))/2) *
                    SIN(('.($lon*1).' * (PI()/180)-longitude*(PI()/180))/2)
                ))
            )
            )) <= '.($distance/1000). ')');
        }
    
        return '';
    }
    

    通常、私は最初にどのように機能するかを理解せずにコードを使用しませんが、この関数は私の頭の上に少しあることを告白しなければなりません...



    1. JsonをSQLテーブルに変換する

    2. DMV(動的管理ビュー)とDMF(動的管理機能)の使用| SQLServerのパフォーマンスのトラブルシューティング-4

    3. Oracleでシーケンスをリセットするにはどうすればよいですか?

    4. SelectでID列名を指定せずにID列の値を取得する方法-SQLServer/T-SQLチュートリアルパート46