2013-07-25 2 views
0

내가 지금 명확하게, 결과는 LIMIT에 의해 추가 WHERE 그리고 마지막으로 첫번째 제한됩니다 하위 쿼리에서 총 행 수 가져 오기?

SELECT row1, row2 
FROM (
    SELECT b.row21, COUNT(b.row21) AS hits 
    FROM table2 AS b 
    WHERE b.row22 = 'foo' OR b.row22 = 'bar' 
    GROUP BY b.row21 
    HAVING hits = 2 
) AS b 
INNER JOIN table1 AS a ON (b.row21 = a.row1) 
WHERE row2 = 123 
LIMIT 10 

같은 쿼리가 있습니다.

그렇다면 별도로 실행하지 않고 하위 쿼리에서 반환하는 행의 양을 어떻게 검색합니까?

+0

어떻게 표시해야하는지 스스로 물어야합니까? 하위 쿼리 카운트는 그룹화 된 함수이며 row1, row2는 단일 함수입니다. 논리적으로는 어디에서 표시 될 것으로 기대합니까? – 7alhashmi

+0

@ 7alhashmi 결과를 웹 사이트에 표시하고 있습니다. 따라서 'LIMIT'을 통해 페이지를 제공하는 동안 전체 결과가 필요합니다. –

답변

1

당신은 변수를 사용하여 MySQL의에서이 작업을 수행 할 수 있습니다

SELECT row1, row2, @rn as numrows 
FROM (
    SELECT b.row21, COUNT(b.row21) AS hits, @rn := @rn + 1 
    FROM table2 b cross join 
     (select @rn := 0) const 
    WHERE b.row22 = 'foo' OR b.row22 = 'bar' 
    GROUP BY b.row21 
    HAVING hits = 2 
) AS b 
INNER JOIN table1 AS a ON (b.row21 = a.row1) 
WHERE row2 = 123 
LIMIT 10; 

당신은 MySQL의 특정 행의 생성을 피할 수있는 것을, 매우 다른 방식으로 쿼리를 다시 작성할 수 있다는 위험이 있습니다. 일부 SQL 컴파일러는이를 수행 할 수있을만큼 똑똑합니다. 나는 MySQL이 똑똑하다고 생각하지 않습니다.

+0

'크로스 조인'은 무엇에 좋은가요? –

+0

@Cobra_Fast. . . 크로스 조인은 변수'@ rn'의 초기 값을 정의하는 데 사용됩니다. –

+0

전체 구문이 10 배에서 20 배 느려지더라도 작동합니다. 속도를 향상시킬 방법이 있습니까? –

관련 문제