Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak uzyskać listę przedmieść otaczających lokalizację, a następnie powtórzyć dla innych lokalizacji za pomocą MySql?

Po prostu musisz wykonać samodołączenie. Dołączanie tabele to bardzo podstawowa część SQL — naprawdę powinien przeczytać o tym przed próbą dalszego zrozumienia tej odpowiedzi.

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

Zobacz go na sqlfiddle .

Zauważyłeś, że użyłem IN() operator jako skrót dla value = A OR value = B OR ... .

Zauważyłeś również, że użyłem DEGREES() i RADIANS() funkcji, zamiast próbować jawnie przeprowadzać takie konwersje.

Mnożyłeś wtedy minuty szerokości geograficznej przez współczynnik 1.851999999962112 , co było dość dziwne:jest bardzo blisko 1.852 , czyli dokładna liczba kilometrów w mili morskiej (historycznie definiowana jako minuta szerokości geograficznej), ale dziwnie nieco inna — założyłem, że zamierzasz użyć tego zamiast.

Na koniec otrzymałeś wartość dosłowną, według której filtrowałeś odległości w zestawie wyników jako ciąg, tj. '60' , podczas gdy oczywiście jest to wartość liczbowa i nie powinno być cytowane.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Który jest szybszy i lżejszy - mysqli i PDO

  2. MYSQL wybierz ostatnie 3 wiersze, uporządkuj według ASC

  3. C# Entity Framework:słowo kluczowe nie jest obsługiwane:„port”

  4. Co to jest typ danych tablicy DC2Type w mysql

  5. MySQL IF ELSEIF w zapytaniu wybierającym