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

Brug af WHERE-sætning til at finde POI inden for en afstand fra længde- og breddegrad

Problemet er, at du ikke kan henvise til en kolonne med alias (distance i dette tilfælde) i en select eller where klausul. Du kan f.eks. ikke gøre dette:

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

Dette vil mislykkes i begge:select sætning, når du forsøger at behandle NewCol + 1 og også i where sætning, når du forsøger at behandle NewCol = 2 .

Der er to måder at løse dette på:

1) Erstat referencen med selve den beregnede værdi. Eksempel:

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

2) Brug en ydre select erklæring:

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

Nu, givet din KÆMPE og ikke særlig menneskevenlige beregnede kolonne :) Jeg synes, du skal gå efter den sidste mulighed for at forbedre læsbarheden:

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;

Rediger: Som @Kaii nævnt nedenfor vil dette resultere i en fuld tabelscanning. Afhængigt af mængden af ​​data, du vil behandle, vil du måske undgå det og gå efter den første mulighed, som burde fungere hurtigere.



  1. Er der en hurtigere måde at indlæse mysqldums på?

  2. Hent ID'et for en indsat post:Php &MS SQL SERVER

  3. Gennemsnit af data for hvert 5. minut på de givne tidspunkter

  4. hvad er en god måde at horisontal shard i postgresql