2013-07-25 3 views
0

이 데이터 세트를 가지고 있으며 내 쿼리를 '다음'논리 행에 기반해야합니다. MySQL의 특정 기준에 따라 '다음'행 선택

id | area | order 
1  front 1 
2  back 2 
3  left 3 
4  middle 4 
5  right 5 
내가 인스턴스의 수를 계산하기 위해 이와 같은 질의를했다

은 전면 영역은 데이터 세트가 이제 변경과 같은 것을 볼 수 있었다 다시 지역

SELECT 
    (SELECT COUNT(id) 
    FROM table AS t2 
    WHERE t2.area = 'back' AND t2.order = (t1.order +1)) AS c, 
FROM table AS t1 
WHERE t1.area = 'front' 

그러나, 다음에 한 곳

id | area | order 
1  front 1 
2  back 3 
4  left 4 
6  middle 7 
9  right 9 

이제 ID와 순서가 증가하지 않고 일부 데이터가 제거 된 다음 다시 추가됩니다.

이 새 데이터 세트를 사용하여 동일한 쿼리를 다시 작성하려면 어떻게해야합니까?

답변

1

원래 쿼리는 오히려 영리합니다. 다음은 약간 다른 접근법입니다. 하위 쿼리에서 다음 영역을 가져옵니다 (예제 에서처럼 상관 된 하위 쿼리 사용). 그런 다음 조건이 true 인 행을 계산합니다.

select sum(case when area = 'Front' and nextarea = 'Back' then 1 else 0 end) 
from (SELECT t1.*, 
      (SELECT t2.area 
       FROM table t2 
       where t2.order > t1.order 
       order by t2.order 
       limit 1 
      ) as nextarea 
FROM table t1; 

이 쿼리는 귀하의 것보다 비용이 많이 듭니다. order 열에서 좋은 동등 조건을 사용할 수있었습니다. 여기서 다음 값을 얻으려면 limit과 함께 정렬이 필요합니다. (order, area)의 복합 색인은 실적을 높여야합니다.

+0

감사합니다. @GordanLinoff - 정말 고무로 찍었습니다 (https://en.wikipedia.org/wiki/Rubber_duck_debugging). 당장 대답 해 봤어. 내가 원래했던 방법을 가지고있어서 기쁘다. –

+0

@jakenoble. . . 전에는 그 용어를 듣지 못했습니다. 우수하고 자주 경험했습니다. –

+0

어떤 아이디어 @GordonLinoff? http://stackoverflow.com/questions/18099683/improving-this-mysql-query-select-as-sub-query - 나의 접근 방식이 풀린 것처럼 보입니다. –

관련 문제