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.