sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan forespørger jeg alle rækker inden for en radius på 5 mil fra mine koordinater?

Du vil have "alle rækker inden for en radius på 5 mil fra en koordinat" , så dette er ikke præcis et K-nearest-neighbour (KNN) problem. Relateret, men din sag er enklere. "Find de 10 rækker, der er tættest på mine koordinater" ville være et KNN-problem.

Konverter dine koordinater til geography værdier:

ST_SetSRID(ST_MakePoint(longitude, latitude),4326)::geography

Alternativt kan du bruge den mere simple geometry type. Overvej:
4.2.2. Hvornår skal man bruge Geografi Datatype over Geometri datatype

Så har vi en tabel som:

CREATE TABLE tbl (
  tbl_id serial PRIMARY KEY
, geog geography NOT NULL
);

Alt du behøver er ST_DWithin() - og et rumligt indeks for at gøre det hurtigt:

CREATE INDEX tbl_geog_gist ON tbl USING gist(geog);

Forespørgsel:

SELECT *, ST_Distance(c.x, geog) AS distance  -- distance is optional
FROM   tbl t, (SELECT ST_GeographyFromText('SRID=4326;POINT(-72.63 42.06)')) AS c(x)
WHERE  ST_DWithin(c.x, geog, 8045)  -- distance in meter
ORDER  BY distance; -- order is optional, you did not ask for that

Eller du kan bruge dine originale kolonner og oprette et funktionelt indeks ... Dette og andre detaljer i dette nært beslægtede svar på dba.SE:

  • Bestil efter afstand


  1. MySQL-fejl 1436:Overløb af trådstak med simpel forespørgsel

  2. Hvad er forskellen mellem CHAR og VARCHAR i SQL Server - SQL Server / T-SQL Tutorial Del 31

  3. JSON-funktioner er nu aktiveret som standard i SQLite

  4. Beregn decil fra seneste i MySQL