Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verwenden der WHERE-Klausel, um POI innerhalb eines Entfernungsbereichs von Längengrad und Breitengrad zu finden

Das Problem ist, dass Sie nicht auf eine Alias-Spalte verweisen können (distance in diesem Fall) in einem select oder where Klausel. Folgendes ist beispielsweise nicht möglich:

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

Dies wird in beiden fehlschlagen:dem select -Anweisung beim Versuch, NewCol + 1 zu verarbeiten und auch im where -Anweisung beim Versuch, NewCol = 2 zu verarbeiten .

Es gibt zwei Möglichkeiten, dies zu lösen:

1) Ersetzen Sie die Referenz durch den berechneten Wert selbst. Beispiel:

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

2) Verwenden Sie ein äußeres select Aussage:

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

Nun, angesichts Ihrer RIESIGEN und nicht sehr menschenfreundlich berechneten Spalte :) Ich denke, Sie sollten sich für die letzte Option entscheiden, um die Lesbarkeit zu verbessern:

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;

Bearbeiten: Wie @Kaii unten erwähnt, führt dies zu einem vollständigen Tabellenscan. Abhängig von der Datenmenge, die Sie verarbeiten, sollten Sie dies möglicherweise vermeiden und sich für die erste Option entscheiden, die schneller ausgeführt werden sollte.