У меня есть две таблицы, как показано ниже:
tbl_properties а также tbl_postcodes
Он должен перечислить свойства в ближайших 5 км выбранных почтовых индексов.
Я пытаюсь получить результат с помощью запроса ниже, но он не получает правильных результатов.
SELECT* FROM (
ВЫБЕРИТЕ стр. *,
КРУГЛЫЙ(
60 * 1.1515 * 1.609344 * Градусы (
АКОС (
COS (RADIANS (шт.latitude
)) * COS (RADIANS (стр.lat
)) * COS (RADIANS (шт.longitude
— п.lng
)) + SIN (RADIANS (шт.latitude
)) * SIN (RADIANS (стр.lng
))
)
),
2
) Как расстояние
ОТ properties
AS p JOIN postcodes_geo AS pc ON (стр.postcode_id
= шт.id
)
ГДЕ p.postcode_id IN (792,790,786,12613)
) КАК ФУТБОЛ ГДЕ ДЛИНА <= 5
Ниже приводится веб-служба, которая предоставляет ту же функцию, которая требуется для поиска по почтовому индексу.
http://www.geonames.org/export/web-services.html
Здесь вы можете передать почтовый индекс и радиус в качестве параметра, и он вернет список почтовых индексов, связанных с этим в формате XML и JSON.
@krishna как насчет запроса, как
SELECT *
FROM (
SELECT properties.*
,(111.045000 * DEGREES(ACOS(COS(RADIANS(- 33.867487)) * COS(RADIANS(lat)) * COS(RADIANS(151.206990 - lng)) + SIN(RADIANS(- 33.867487)) * SIN(RADIANS(lat))))) AS distance
FROM `properties`
WHERE `properties`.`deleted_at` IS NULL
AND lat BETWEEN - 33.912514
AND - 33.822460
AND lng BETWEEN 151.152763
AND 151.261218
) AS properties
WHERE `properties`.`deleted_at` IS NULL
UNION
SELECT *
FROM (
SELECT properties.*
,(111.045000 * DEGREES(ACOS(COS(RADIANS(- 33.914437)) * COS(RADIANS(lat)) * COS(RADIANS(151.241642 - lng)) + SIN(RADIANS(- 33.914437)) * SIN(RADIANS(lat))))) AS distance
FROM `properties`
WHERE `properties`.`deleted_at` IS NULL
AND lat BETWEEN - 33.959464
AND - 33.869411
AND lng BETWEEN 151.187384
AND 151.295899
) AS properties
WHERE `properties`.`deleted_at` IS NULL
UNION
SELECT *
FROM (
SELECT properties.*
,(111.045000 * DEGREES(ACOS(COS(RADIANS(- 33.914437)) * COS(RADIANS(lat)) * COS(RADIANS(151.241642 - lng)) + SIN(RADIANS(- 33.914437)) * SIN(RADIANS(lat))))) AS distance
FROM `properties`
WHERE `properties`.`deleted_at` IS NULL
AND lat BETWEEN - 33.959464
AND - 33.869411
AND lng BETWEEN 151.187384
AND 151.295899
) AS properties
WHERE `properties`.`deleted_at` IS NULL Limit 10
,10
Это может помочь вам по мере необходимости, но вам нужно немного потренироваться для подготовки запроса