sql >> Databáze >  >> RDS >> Mysql

Jak získat seznam předměstí v okolí místa a poté opakovat pro další místa pomocí MySql?

Jednoduše musíte provést vlastní připojení. Připojování tabulky je velmi základní část SQL – vy skutečně měli byste si to přečíst, než se pokusíte dále porozumět této odpovědi.

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

Podívejte se na sqlfiddle .

Určitě jste si všimli, že jsem použil IN() operátor jako zkratka pro value = A OR value = B OR ... .

Také jste si všimli, že jsem použil DEGREES() a RADIANS() namísto pokusu o explicitní provedení těchto konverzí.

Potom jste vynásobili minuty zeměpisné šířky faktorem 1.851999999962112 , což bylo poněkud zvláštní:je extrémně blízko 1.852 , což je přesný počet kilometrů na námořní míli (historicky definovaná jako minuta zeměpisné šířky), ale přesto je bizarně mírně odlišný – předpokládal jsem, že místo toho chcete použít tento.

Nakonec jste měli doslovnou hodnotu, podle které jste filtrovali vzdálenosti v sadě výsledků, jako řetězec, tj. '60' , přičemž se zjevně jedná o číselnou hodnotu a neměla by být v uvozovkách.



  1. Monitorování protokolu transakcí

  2. Jak vložit dlouhý řetězec do datového typu CLOB v Oracle

  3. mysql vyberte data bez tabulek

  4. Validace UNIQUE pole v Codeigniter se 2 indexy