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

Hvordan får man en liste over forstæder, der omgiver en placering, og gentag derefter for andre steder ved hjælp af MySql?

Du skal blot udføre en selv-join. Deltager tables er en meget grundlæggende del af SQL – du virkelig bør læse op på det, før du forsøger at forstå dette svar yderligere.

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 bemærket, at jeg har brugt MySQL's IN() operator som en forkortelse for value = A OR value = B OR ... .

Du har også bemærket, at jeg har brugt MySQL's DEGREES() og RADIANS() fungerer i stedet for at forsøge at udføre sådanne konverteringer eksplicit.

Du multiplicerede så minutter af breddegrad med en faktor på 1.851999999962112 , hvilket var ret mærkeligt:​​det er ekstremt tæt på 1.852 , som er det præcise antal kilometer i en sømil (historisk defineret som et minuts breddegrad), men alligevel bizart lidt anderledes – jeg har antaget, at du ville bruge det i stedet for.

Endelig havde du den bogstavelige værdi, som du filtrerede afstandene i resultatsættet med som en streng, dvs. '60' , hvorimod dette naturligvis er en numerisk værdi og bør være uden anførselstegn.



  1. hvordan man udfylder mysql kolonneværdi baseret på en formel?

  2. Sådan konverteres en normal forespørgsel til en krydstabuleringsforespørgsel i Access

  3. JDBC returnerer forkert antal berørte rækker

  4. Hvad er STATISTICS PROFIL i SQL Server?