2011-01-17 7 views
6

Mysql, 나는 가능한 모든 레코드 수를 얻기 위해 SQL_CALC_FOUND_ROWS를 사용하고 있습니다.
UNION에서 어떻게 사용합니까?
유일한 다소 떨어져 보인다 지금 나를 위해 작동 것은, 상기 FOUND_ROWS() documentation에서UNION이있는 쿼리에 SQL_CALC_FOUND_ROWS를 구현하려면 어떻게해야합니까?

SELECT COUNT(*) 
FROM(SELECT * FROM t1 UNION SELECT * FROM t2) A; 

또는

SELECT SQL_CALC_FOUND_ROWS * 
FROM(SELECT * FROM t1 UNION SELECT * FROM t2) A; 
+0

솔루션에 문제가 있습니까? –

답변

16

:

SQL_CALC_FOUND_ROWS와 FOUND_ROWS의 사용()는 단순 SELECT 문보다 UNION 문에 대해 더 복잡합니다. LIMIT는 UNION의 여러 위치에 에서 발생할 수 있습니다. UNION의 SELECT 문에 개별적으로 적용된 이거나 전체적으로 UNION 결과가 인 global 일 수 있습니다.

UNION에 대한 SQL_CALC_FOUND_ROWS의 목적은 그것이 글로벌 LIMIT없이 반환되는 행 수를 반환해야한다는 것입니다. UNION과 함께 SQL_CALC_FOUND_ROWS를 사용 의 조건은 다음과 같습니다

  • SQL_CALC_FOUND_ROWS 키워드 가 UNION의 첫 번째 SELECT에 나타나야합니다.

  • UNION ALL이 사용되는 경우에만 FOUND_ROWS()의 값은 정확한 입니다. UNION ALL을 사용하면 중복 제거 이 발생하고 FOUND_ROWS() 의 값은 근사치에 불과합니다.

  • 제한이 UNION에 존재하지 않는 경우

    는 SQL_CALC_FOUND_ROWS은 무시되고 프로세스 UNION에 생성 된 임시 테이블의 행 반환 수.

  • 당신 만 UNION의 첫 번째 SELECTSQL_CALC_FOUND_ROWS를 지정해야합니다
+0

SELECT __CONF_FOUND_ROWS * FROM ((SELECT 열 FROM t1) UNION ALL (SELECT 열 FROM t2)) _UT' * NOT *'SELECT * FROM (SELECT SQL_CALC_FOUND_ROWS 열 FROM t1) UNION ALL t2)) _ut' – mpen

2

; COUNT(*)을 사용할 때와 같이 실제로는 바깥 쪽 SELECT 쿼리가 필요하지 않습니다.

SELECT * FROM my_table1 
UNION ALL 
SELECT * FROM my_table2 
UNION ALL 
SELECT * FROM my_table3 
LIMIT 0,10; 

우리는 간단하게 작성할 수 있습니다 :

SELECT SQL_CALC_FOUND_ROWS * FROM my_table1 
UNION ALL 
SELECT * FROM my_table2 
UNION ALL 
SELECT * FROM my_table3 
LIMIT 0,10; 

우리는 다음 전화 :

SELECT FOUND_ROWS(); 

예로서

, 이제 우리는 다음 LIMIT 에드 쿼리가 있다고 가정 해 보자 귀하의 질문에 언급 된 바깥 질의와 J에 대한 언급에서 약간의 오버 헤드를 피할 수 있습니다. oe Stefanelli의 대답 (비록 내가 완전히 눈에 띄는 차이가있을 것이라고 확신하지는 않지만).

나는 그것을 다시 반복하면 UNION ALL을 사용하는 경우이 은 오히려 UNION보다 작동합니다 가치가 있다고 생각 -이은 행 개수가 중복이 제거되기 전에 계산되기 때문에, 당신은 FOUND_ROWS()에서 동일한 결과를 얻을 수 있습니다 의미 UNION ALL을 사용한 경우와 마찬가지입니다.

관련 문제