Я пытаюсь завершить модификацию этого учебника Google.
Я написал этот SQL для запроса таблицы местоположений, используя местоположение «имя». Учитывая название местоположения, запрос возвращает пиццерии в непосредственной близости. Для этого я соединил свою таблицу местоположений ресторанов, назвал ее «маркеры» и рассчитал расстояния, используя формулу Хаверсина.
SELECT m.address,
m.name,
m.lat,
m.lng,
(3959 * ACOS(COS(RADIANS(poi.lat)) *
COS(RADIANS(m.lat)) *
COS(RADIANS(m.lng) - RADIANS(poi.lng)) + SIN(RADIANS(poi.lat))*
SIN(RADIANS(m.lat)))) AS distance
FROM markers poi
CROSS JOIN markers m
WHERE poi.address LIKE "%myrtle beach%"
AND poi.id <> m.id HAVING distance < 200
ORDER BY distance LIMIT 0,20
Запрос возвращает ожидаемые результаты, но если точка интереса находится за пределами указанной области, в данном случае «миртл-бич», я получаю повторяющиеся записи для каждого совпадения. Это связано с тем, что CROSS JOIN легко исправить с помощью выбора DISTINCT. Но поля "lng" и "lat" относятся к типам FLOAT, поэтому расчеты расстояния никогда не бывают идентичными, даже для повторяющихся записей.
Вот подмножество возвратов:
3901 North Kings Highway Suite 1, Миртл-Бич, Южная Каролина | Восток Чикаго Pizza Company | 33,716099 -78,855583 | 4.0285562196955125
1706 S Kings Hwy # A, Миртл-Бич, Южная Каролина | Пицца Домино: Миртл-Бич | 33.674881 | -78.905144 | 4.0285562196955125
82 Wentworth St, Чарльстон, Южная Каролина | Андолинис Пицца | 2.782330 | -79,934235 | 85,68177495224947
82 Wentworth St, Чарльстон, Южная Каролина | Андолинис Пицца | 32.782330 | -79,934235 | 89.71000040441085
114 Jungle Rd, остров Эдисто, Южная Каролина | Бакс Пицца Эдисто Бич Инк | 32.503971 -80.297951 | 114.22243529200529
114 Jungle Rd, остров Эдисто, Южная Каролина | Бакс Пицца Эдисто Бич Инк | 32.503971 -80.297951 | 118.2509427998286"
Любые предложения о том, куда идти отсюда?
Haversine
функции. - person bishop   schedule 22.02.2014