PostGIS
Non conservare lat e long su un tavolo come quello. Utilizzare invece una geometria PostGIS o un tipo geografico .
CREATE EXTENSION postgis;
CREATE TABLE foo (
geog geography;
);
CREATE INDEX ON foo USING gist(geog);
INSERT INTO foo (geog)
VALUES (ST_MakePoint(x,y));
Ora, quando devi interrogarlo, puoi utilizzare KNN (<->
)
che lo farà effettivamente su un indice.
SELECT *
FROM foo
ORDER BY foo.geog <-> ST_MakePoint(x,y)::geography;
Nella tua richiesta, hai esplicitamente HAVING distance < 5
. Puoi farlo anche sull'indice.
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;
Ciò garantisce che non venga restituito nulla se tutti i punti si trovano al di fuori di distance_in_meters
.
Inoltre xey sono numeri decimali ST_MakePoint(46.06, 14.505)