SELECT
(
6371 * acos (
cos ( radians( {목적지 위도} ) )
* cos( radians( {내위치 위도} ) )
* cos( radians( {목적지 경도} ) - radians( {내위치 경도} ) )
+ sin ( radians( {목적지 위도} ) )
* sin( radians( {내위치 위도} ) )
)
) AS distance
FROM places
HAVING distance < {원하는 반경 ex.500m면 0.5}
ORDER BY distance;
6371은 지구 반지름을 km로 나타낸 것으로 그냥 두고 radians의 괄호안의 값을 바꾸어 계산한다.
원하는 반경은 HAVING 절을 이용하여 조절 할 수 있다.
나는 places 테이블에 latitude와 longitude 컬럼이 있어 컬럼 값을 가지고와 계산하였고,
그 중 10km 이내 데이터를 조회하였다.
SELECT
(
6371 * acos (
cos ( radians(latitude) )
* cos( radians(37.56726109866003) )
* cos( radians(longitude) - radians(127.1903672271528) )
+ sin ( radians(latitude) )
* sin( radians(37.56726109866003) )
)
) AS distance
FROM places
HAVING distance < 10
ORDER BY distance
LIMIT 0 , 10;
✨ result
+-------------------+
| distance |
+-------------------+
| 5.183107413771042 |
| 5.325682485437883 |
| 5.76121672748217 |
| 7.224819777240822 |
| 8.514181604475779 |
| 8.950925292675505 |
| 9.241103258775375 |
| 9.249974510246574 |
| 9.314941889143482 |
| 9.464445622192283 |
+-------------------+