select * from 테이블 where 1=1 and x_axis between x_axis-500 and x_axis+500 and y_axis between y_axis-500 and y_axis+500 and sqrt((x_axis-x_axis)*(x_axis+x_axis)+(y_axis-y_axis)*(y_axis+y_axis))<=500
by 마농
[2011.07.06 10:49:12]
x_axis 가 여러번 나오는데 같은 값으로 체크하는게 이상하네요?
1,2 라인은 무조건 참일수밖에 없겠죠.
자기자신에서 500 뺀거랑 500 더한거 사이에 자기자신이 있을 수 밖에 없죠
3번라인은 자기자신의 값을 빼면(x_axis-x_axis) 무조건 0 이 나오죠.
by 손님
[2011.07.06 11:02:34]
그럼어떻게해야되나요>
by 마농
[2011.07.06 11:02:47]
혹시 여러번 나오는 x_axis 가 하나는 테이블의 컬럼이고 하나는 중심점의 좌표라면?
똑같이 표현하시면 안되죠...
중심점의 좌표를 변수로 입력받는다면 변수명을 달리 하셔야 합니다.
중심점의 좌표 변수를 v_x_axis, v_y_axis 로 바꿔 보면
AND x_axis BETWEEN v_x_axis - 500 AND v_x_axis + 500
AND y_axis BETWEEN v_y_axis - 500 AND v_y_axis + 500
AND SQRT(POWER(x_axis - v_x_axis, 2) + POWER(y_axis - v_y_axis, 2)) <= 500
by 허재영
[2011.07.06 11:11:08]
중심점좌표를 x,y 로 보고 어느 한점 좌표가 x_axis, y_axis 이면
삼각함수의 정의를 이용해서 빗변의 길이가 곧 두점사이의 거리가 됩니다.
x - x_axis 밑변 길이(제곱하니까 부호 상관없음)
y - y_axis 높이 길이(제곱하니까 부호 상관없음)
빗변 = (루트 ((밑변제곱) + (높이제곱)))
select * from 테이블
where sqrt(power(x - x_axis,2) + power(y - y_axis,2)) <= 500
주의 할점은 x, y 좌표가 GPS 위도 경도이면 실제 우리가 사용하는 거리와 차이가 존재합니다.
by 마농
[2011.07.06 11:24:51]
1,2,3 라인의 조건중 실제로 필요한 조건은 3라인의 조건이죠.
3라인의 조건만으로도 원하는 자료를 얻을 수 있습니다.
그러나 이 조건만 있다면 전체자료를 모두 읽어와 계산하게 됩니다.
1,2, 라인의 역할은 인덱스를 이용해 우선 계산범위를 줄여주는 것입니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.