sql >> Databasteknik >  >> RDS >> Mysql

Hur får man en lista över förorter som omger en plats och upprepar sedan för andra platser med MySql?

Du behöver helt enkelt utföra en självanslutning. Gå med tabeller är en mycket grundläggande del av SQL – du verkligen bör läsa på det innan du försöker förstå det här svaret ytterligare.

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

Se den på sqlfiddle .

Du har märkt att jag har använt MySQL:s IN() operator som en förkortning för value = A OR value = B OR ... .

Du har också märkt att jag har använt MySQL:s DEGREES() och RADIANS() fungerar snarare än att försöka utföra sådana konverteringar explicit.

Du multiplicerade då latitudminuter med en faktor 1.851999999962112 , vilket var ganska konstigt:det är extremt nära 1.852 , som är det exakta antalet kilometer i en sjömil (historiskt definierat som en minut av latitud), men ändå konstigt nog något annorlunda – jag har antagit att du menade att använda det istället.

Slutligen hade du det bokstavliga värdet med vilket du filtrerade avstånden i resultatuppsättningen som en sträng, dvs. '60' , medan detta uppenbarligen är ett numeriskt värde och bör vara utan citat.



  1. Hur fungerar contains() i PL-SQL?

  2. SQL välj max(datum) och motsvarande värde

  3. Versaler av personnamn i programmering

  4. Spara data till PHP / Mysql med inline-redigering i CKEditor