@OllieJones がコメントしたように、harsine式を使用して大圏距離を計算する必要があります。可能な限り多くをキャッシュするために、Google コードのPHP、MySQL、Google マップを使用したストア ロケータの作成から適応します。
ALTER TABLE Postcodes
ADD tc DOUBLE COMMENT 'cosine of latitude',
ADD ts DOUBLE COMMENT 'sine of latitude',
ADD gr DOUBLE COMMENT 'longitude in radians',
ADD UNIQUE INDEX (Postcode);
CREATE TRIGGER Postcode_insert BEFORE INSERT ON Postcodes FOR EACH ROW SET
NEW.tc = cos(radians(NEW.Latitude)),
NEW.ts = sin(radians(NEW.Latitude)),
NEW.gr = radians(NEW.Longitude);
CREATE TRIGGER Postcode_update BEFORE UPDATE ON Postcodes FOR EACH ROW SET
NEW.tc = cos(radians(NEW.Latitude)),
NEW.ts = sin(radians(NEW.Latitude)),
NEW.gr = radians(NEW.Longitude);
UPDATE Postcodes SET tc = NULL; -- trigger will do the rest
CREATE VIEW distance AS
SELECT s.Id AS PostID, u.Postcode,
acos(s.tc*u.tc*cos(s.gr-u.gr) + s.ts*u.ts) AS radii
FROM Postcodes s, Postcodes u;
その後、あなたがする必要があるのは次のとおりです。
SELECT Locations.*, 3959 * distance.radii AS miles
FROM Locations JOIN distance USING (PostID)
WHERE distance.Postcode = ?
HAVING miles < ?
sqlfiddleで参照してください。