위도, 경도 및 반경 매개 변수를 기반으로 가장 가까운 도시를 계산하는이 함수가 있습니다.지리적 위치 거리 도시 테이블의 SQL
> +------------+-------------+------+-----+---------+----------------+ |
> Field | Type | Null | Key | Default | Extra |
> +------------+-------------+------+-----+---------+----------------+ |
> id | int(11) | NO | PRI | NULL | auto_increment | |
> country_id | smallint(6) | NO | | NULL | | |
> region_id | smallint(6) | NO | | NULL | | |
> city | varchar(45) | NO | | NULL | | |
> latitude | float | NO | | NULL | | |
> longitude | float | NO | | NULL | | |
> timezone | varchar(10) | NO | | NULL | | |
> dma_id | smallint(6) | YES | | NULL | | |
> code | varchar(4) | YES | | NULL | |
> +------------+-------------+------+-----+---------+----------------+
그것은 매우 잘 작동 :
DELIMITER $$
DROP PROCEDURE IF EXISTS `world_db`.`geolocate_close_cities`$$
CREATE PROCEDURE `geolocate_close_cities`(IN p_latitude DECIMAL(8,2), p_longitude DECIMAL(8,2), IN p_radius INTEGER(5))
BEGIN
SELECT id, country_id, longitude, latitude, city,
truncate((degrees(acos(sin(radians(latitude))
* sin(radians(p_latitude))
+ cos(radians(latitude))
* cos(radians(p_latitude))
* cos(radians(p_longitude - longitude))))
* 69.09*1.6),1) as distance
FROM cities
HAVING distance < p_radius
ORDER BY distance desc;
END$$
DELIMITER ;
여기 내 도시 테이블의 구조입니다. 내가 할 (pseudcode를) LKE 것 무엇
은 같은 것입니다 :
SELECT * FROM cities WHERE DISTANCE(SELECT id FROM cities WHERE id={cityId}, {km))
그것은 나에게 가장 가까운 도시를 돌아갑니다.
어떻게 할 수 있습니까?
지금은 함수를 호출 한 다음 ID를 배열로 반복 한 다음 도시 테이블에서 WHEREIN을 수행합니다. 이는 분명히 효율적이지 않습니다.
도움이 필요합니다. 감사.
안녕하세요 @ 올리 존스. 신속한 응답에 감사드립니다. 솔직히 말해서, 나는 당신의 SQL이하는 것과 일치하도록 내 함수를 변경하는 방법을 완전히 이해한다는 것을 너무 확신하지 못한다. 감사! :-) – Flukey
내가 하버 사인 공식을 createde 것은, 여기 내 쿼리 : cities_temp에서 'SELECT * 곳 52.205> = a.latitude - 100/111.12 과 52.205 <= a.latitude + 100/111.12 및 하버 사인 (52.205, 위도가 52.205이고 경도가 0.144 인 경우 (52.205, a.latitude, 0.144, a.longitude, 'KM') 위도 (0.144, a.longitude, 'KM') <= 100 영국 케임브리지) – Flukey