2013-07-21 2 views
1

데이터의 동일한 하위 집합에서 4 개의 다소 큰 MySQL 쿼리를 실행해야하는 스크립트가 있습니다. 그것들을 하나의 쿼리로 결합하는 방법이 있습니까?SQL SUM 절 결합하기

Select sum(value) From 
    (Select lat, lng, value From `pop_geo_199` Where (
     (lat Between 38.1768916977 And 39.6131083023) And (lng Between -77.9596650363 And -76.1143349637)) 
     ) As FirstCut 
Where (acos(0.627895140732*sin(radians(lat)) + 0.778297945677*cos(radians(lat))*cos(radians(lng)-(-1.34454929586))) * 6371 < 79.85) 

당신은 아마 알 수 있듯이,이 위도와 경도 지점의 지리적 쿼리는 다음과 같습니다

처럼 쿼리 모습입니다. 쿼리가 수행하는 작업은 먼저 전체 테이블 (FirstCut)의 간단한 사각형 부분 집합을 만든 다음 그 위에 trig 함수를 실행하여 원형 영역을 얻습니다.

천천히가는 쿼리의 부분은 FirstCut입니다. 드로잉 할 테이블에 280 만 개의 행이 있으므로이 부분이 FirstCut입니다. FirstCut,이 경우에는 약 27,922 개의 행만 있으므로 trig 부분은 비교하여 빠르게 빠릅니다.

문제는 몇 가지를 실행해야한다는 것입니다. 그들은 같은 영역에 중심이 다른 반지름이기 때문에 모두 동일한 FirstCut을 사용할 수 있습니다. 4 개 대신 하나의 쿼리만으로이 문제를 해결할 수 있기를 바랍니다. 조건 만 작은 반경입니다 (- 절은 약간의 어디에 있는지 정확히 마지막을 제외한 다른 것과 동일 볼 수 있듯이 다른이

Select sum(value) From 
    (Select lat, lng, value From `pop_geo_199` Where (
     (lat Between 38.1768916977 And 39.6131083023) And (lng Between -77.9596650363 And -76.1143349637)) 
     ) As FirstCut 
Where (acos(0.627895140732*sin(radians(lat)) + 0.778297945677*cos(radians(lat))*cos(radians(lng)-(-1.34454929586))) * 6371 < 48.57) 

: 여기

이 같은 두 번째 쿼리는 모습입니다 79.85 대신 48.57).

효과적으로 두 쿼리를 하나의 쿼리로 결합 할 수 있습니까?

나는 CASE 절을 사용해 보았습니다. 이것이 최선의 방법입니까?

Select 

sum(case when (acos(0.627895140732*sin(radians(lat)) + 0.778297945677*cos(radians(lat))*cos(radians(lng)-(-1.34454929586))) * 6371 < 79.85) then value else 0 end), 

sum(case when (acos(0.627895140732*sin(radians(lat)) + 0.778297945677*cos(radians(lat))*cos(radians(lng)-(-1.34454929586))) * 6371 < 48.57) then value else 0 end) 

From (Select lat, lng, value From `pop_geo_199` Where ((lat Between 38.1768916977 And 39.6131083023) And (lng Between -77.9596650363 And -76.1143349637))) As FirstCut; 

답변

1

이 경우 CASE 문을 사용할 수 있습니다. 계산을 하위 쿼리로 이동할 수도 있습니다.

Select 
    sum(case 
      when rad < 79.85 
      then value 
      else 0 end) 1stQuerySum, 
    sum(case 
      when rad < 48.57 
      then value 
      else 0 end) 2ndQuerySum 
From ( 
    Select lat, lng, value, 
      acos(0.627895140732*sin(radians(lat)) + 0.778297945677*cos(radians(lat))*cos(radians(lng)-(-1.34454929586))) * 6371 rad 
    From `pop_geo_199` 
    Where (
     (lat Between 38.1768916977 And 39.6131083023) And 
     (lng Between -77.9596650363 And -76.1143349637) 
    ) 
) As FirstCut 
+0

아, 감사합니다! 그것은 내가하려는 것이지만 계산을 하위 쿼리로 이동하는 방법을 파악할 수 없었습니다. – nucleon

+0

@nucleon - np, 다행스럽게 도울 수있어! – sgeddes