PostGIS
No almacene latitud y longitud en una tabla como esa. En su lugar, utilice una geometría de PostGIS o tipo de geografía .
CREATE EXTENSION postgis;
CREATE TABLE foo (
geog geography;
);
CREATE INDEX ON foo USING gist(geog);
INSERT INTO foo (geog)
VALUES (ST_MakePoint(x,y));
Ahora, cuando necesite consultarlo, puede usar KNN (<->
)
que en realidad hará esto en un índice.
SELECT *
FROM foo
ORDER BY foo.geog <-> ST_MakePoint(x,y)::geography;
En su consulta, tiene explícitamente HAVING distance < 5
. También puede hacer eso en el índice.
SELECT *
FROM foo
WHERE ST_DWithin(foo.geog, ST_MakePoint(x,y)::geography, distance_in_meters)
ORDER BY foo.geog <-> ST_MakePoint(x,y)::geography;
Esto garantiza que no se devuelva nada si todos los puntos se encuentran fuera de distance_in_meters
.
Además x e y son números decimales ST_MakePoint(46.06, 14.505)