sql >> Databasteknik >  >> RDS >> Mysql

Använder WHERE-satsen för att hitta POI inom ett avstånd från Longitud och Latitude

Problemet är att du inte kan referera till en aliaskolumn (distance i det här fallet) i en select eller where klausul. Du kan till exempel inte göra detta:

select a, b, a + b as NewCol, NewCol + 1 as AnotherCol from table
where NewCol = 2

Detta kommer att misslyckas i båda:select uttalande när du försöker bearbeta NewCol + 1 och även i where uttalande när du försöker bearbeta NewCol = 2 .

Det finns två sätt att lösa detta:

1) Ersätt referensen med det beräknade värdet i sig. Exempel:

select a, b, a + b as NewCol, a + b + 1 as AnotherCol from table
where  a + b = 2

2) Använd en yttre select uttalande:

select a, b, NewCol, NewCol + 1 as AnotherCol from (
    select a, b, a + b as NewCol from table
) as S
where NewCol = 2

Nu, med tanke på din ENORMA och inte särskilt människovänliga beräknade kolumn :) Jag tycker att du ska välja det sista alternativet för att förbättra läsbarheten:

SET @orig_lat=55.4058;  
SET @orig_lon=13.7907; 
SET @dist=10;

SELECT * FROM (
  SELECT 
    *, 
    3956 * 2 * ASIN(SQRT(POWER(SIN((@orig_lat -abs(latitude)) * pi()/180 / 2), 2) 
    + COS(@orig_lat * pi()/180 ) * COS(abs(latitude) * pi()/180) 
    * POWER(SIN((@orig_lon - longitude) * pi()/180 / 2), 2) )) as distance 
  FROM geo_kulplex.sweden_bobo
) AS S
WHERE distance < @dist
ORDER BY distance limit 10;

Redigera: Som @Kaii nämnde nedan kommer detta att resultera i en fullständig tabellskanning. Beroende på mängden data du kommer att bearbeta kanske du vill undvika det och välja det första alternativet, som bör fungera snabbare.



  1. MYSQL-utdata i trädformat ELLER Lägger till nivå (förälder-barn)

  2. Hur man ansluter till flera SQL-servrar med ett klick (registrerad servergrupp) - SQL Server / TSQL självstudie del 5

  3. MySQL in the Cloud - Online Migration From Amazon RDS to EC2 Instance:Part One

  4. Hur Ceiling() fungerar i PostgreSQL