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

Come ottenere un elenco dei sobborghi che circondano una località e ripetere per altre località utilizzando MySql?

Devi semplicemente eseguire un self-join. Partecipare tabelle è un molto parte fondamentale di SQL:tu davvero dovrebbe leggere su di esso prima di provare a capire ulteriormente questa risposta.

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

Guardalo su sqlfiddle .

Avrai notato che ho utilizzato IN() operatore come abbreviazione di value = A OR value = B OR ... .

Avrai anche notato che ho utilizzato DEGREES() e RADIANS() funzioni anziché tentare di eseguire tali conversioni in modo esplicito.

Stavi quindi moltiplicando i minuti di latitudine per un fattore di 1.851999999962112 , il che era piuttosto strano:è estremamente vicino a 1.852 , che è il numero preciso di chilometri in una miglio nautico (storicamente definito come un minuto di latitudine), ma stranamente leggermente diverso:ho pensato che tu volessi usarlo invece.

Infine, avevi il valore letterale in base al quale stavi filtrando le distanze nel set di risultati come una stringa, ovvero '60' , mentre ovviamente questo è un valore numerico e non dovrebbe essere tra virgolette.