sql >> Database teknologi >  >> RDS >> Mysql

mySQL vælg postnumre inden for x km/miles inden for rækkevidde af y

Du skal bruge noget, der hedder Haversine-formlen :

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

Og formlen:

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 '';
}

Normalt bruger jeg ikke kode uden først at forstå, hvordan det virker, men jeg må indrømme, at denne funktion er lidt over hovedet på mig...



  1. MySQL JOIN med LIMIT 1 på sammenføjet bord

  2. Kan relationsdatabase skalere horisontalt

  3. Brug af Oracle JDeveloper Snippets med MySQL

  4. Hvordan gemmer jeg XML-data i en mysql-database? Jeg vil ikke have fremmednøgler som en gal