Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment obtenir une liste des banlieues entourant un emplacement puis répéter pour d'autres emplacements en utilisant MySql ?

Vous devez simplement effectuer une auto-jointure. Rejoindre tables est un très partie fondamentale de SQL—vous vraiment devrait le lire avant d'essayer de comprendre davantage cette réponse.

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

Voir sur sqlfiddle .

Vous aurez remarqué que j'ai utilisé le IN() opérateur en tant que raccourci pour value = A OR value = B OR ... .

Vous aurez également remarqué que j'ai utilisé le DEGREES() et RADIANS() fonctions plutôt que d'essayer d'effectuer explicitement de telles conversions.

Vous multipliiez alors les minutes de latitude par un facteur de 1.851999999962112 , ce qui était plutôt étrange :il est extrêmement proche de 1.852 , qui est le nombre précis de kilomètres dans un mile nautique (historiquement défini comme une minute de latitude), mais pourtant bizarrement légèrement différent - j'ai supposé que vous vouliez l'utiliser à la place.

Enfin, vous aviez la valeur littérale par laquelle vous filtriez les distances dans le jeu de résultats sous forme de chaîne, c'est-à-dire '60' , alors qu'il s'agit évidemment d'une valeur numérique et qu'elle ne doit pas être entre guillemets.