Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie erhalte ich eine Liste der Vororte, die einen Standort umgeben, und wiederholen Sie dies dann für andere Standorte mit MySql?

Sie müssen lediglich einen Self-Join durchführen. Beitreten Tabellen ist ein sehr grundlegender Teil von SQL – Sie wirklich sollten sich darüber informieren, bevor Sie versuchen, diese Antwort weiter zu verstehen.

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

Sehen Sie es auf sqlfiddle .

Sie werden bemerkt haben, dass ich IN() Operator als Kurzform für value = A OR value = B OR ... .

Sie werden auch bemerkt haben, dass ich MySQLs DEGREES() und RADIANS() Funktionen, anstatt zu versuchen, solche Konvertierungen explizit durchzuführen.

Sie haben dann Breitenminuten mit dem Faktor 1.851999999962112 multipliziert , was ziemlich seltsam war:Es liegt sehr nahe an 1.852 , das ist die genaue Anzahl von Kilometern in einer Seemeile (historisch definiert als Breitengradminute), aber dennoch bizarr etwas anders – ich habe angenommen, Sie wollten stattdessen diese verwenden.

Schließlich hatten Sie den Literalwert, nach dem Sie die Entfernungen in der Ergebnismenge als Zeichenfolge gefiltert haben, dh '60' , wobei dies offensichtlich ein numerischer Wert ist und nicht in Anführungszeichen gesetzt werden sollte.