Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Korzystanie z klauzuli WHERE, aby znaleźć POI w zakresie odległości od długości i szerokości geograficznej

Problem polega na tym, że nie można odwołać się do kolumny z aliasem (distance w tym przypadku) w select lub where klauzula. Na przykład nie możesz tego zrobić:

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

To się nie powiedzie w obu:select oświadczenie podczas próby przetworzenia NewCol + 1 a także w where instrukcja przy próbie przetworzenia NewCol = 2 .

Można to rozwiązać na dwa sposoby:

1) Zastąp odniesienie samą obliczoną wartością. Przykład:

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

2) Użyj zewnętrznego select oświadczenie:

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

Teraz, biorąc pod uwagę twoją OGROMNĄ i niezbyt przyjazną dla człowieka kolumnę obliczeniową :) Myślę, że powinieneś wybrać ostatnią opcję, aby poprawić czytelność:

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;

Edytuj: Jak wspomniano poniżej @Kaii, spowoduje to pełne skanowanie tabeli. W zależności od ilości danych, które będziesz przetwarzać, możesz tego uniknąć i wybrać pierwszą opcję, która powinna działać szybciej.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie do obliczenia sumy odległości (długość, szerokość geograficzna) w kolejnych wierszach w Mysql

  2. czy powinienem ponownie użyć kursora w module MySQLdb w Pythonie?

  3. Ostrzeżenie PHP:mysqli_connect():(HY000/2002):Połączenie odrzucone

  4. Problemy z dodaniem nowego ID (automatycznej inkrementacji) po zaistnieniu tabeli

  5. Zaktualizuj tabelę MySQL o rankingi rekordów w grupach