2011-01-17 22 views
6

Mysql, estoy usando SQL_CALC_FOUND_ROWS para obtener la cantidad total de registros posibles.
¿Cómo lo uso en UNION?
La única cosa que funciona para mí en este momento, que parece algo fuera es decir:¿Cómo implemento SQL_CALC_FOUND_ROWS en una consulta con UNION?

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

o

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

¿Qué pasa con sus soluciones? –

Respuesta

16

Desde el FOUND_ROWS() documentation:

El uso de SQL_CALC_FOUND_ROWS y FOUND_ROWS() es más complejo para las instrucciones UNION que para las declaraciones simples SELECT , porque LÍMITE puede ocurrir en lugares múltiples en UNIÓN. Puede ser aplicado a las declaraciones individuales SELECT en la UNIÓN, o global a el resultado de la UNIÓN como un todo.

La intención de SQL_CALC_FOUND_ROWS para UNION es que debe devolver la fila recuento que serían devueltos sin un límite global . Las condiciones para el uso de SQL_CALC_FOUND_ROWS con UNION son:

  • La palabra clave debe SQL_CALC_FOUND_ROWS aparecerá en el primer SELECT de la UNION .

  • El valor de FOUND_ROWS() es exacto solo si se utiliza UNION ALL. Si se usa UNION sin TODO, se produce la eliminación duplicada y el valor de FOUND_ROWS() es solo aproximado.

  • Si hay límite está presente en la Unión, SQL_CALC_FOUND_ROWS se ignora y devuelve el número de filas de la tabla temporal que se crea para proceso de la UNION.

+0

Solo para aclarar, es 'SELECT SQL_CALC_FOUND_ROWS * FROM ((SELECCIONE columnas FROM t1) UNION ALL (SELECCIONE columnas FROM t2)) _ut' * not *' SELECT * FROM ((SELECCIONE columnas SQL_CALC_FOUND_ROWS FROM t1) UNION ALL (columnas SELECT FROM t2)) _ut' – mpen

2

Debe especificar SQL_CALC_FOUND_ROWS en el primer SELECT en sólo el UNION; en realidad no necesita una consulta externa SELECT como lo hace cuando usa COUNT(*).

A modo de ejemplo, supongamos que tenemos la siguiente consulta LIMIT ed:

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

simplemente podemos escribir:

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

entonces llamamos:

SELECT FOUND_ROWS(); 

Este evita algunos gastos indirectos de tener la consulta externa mencionada en su pregunta y en los comentarios de J o la respuesta de Stefanelli (aunque no estoy del todo convencido de que sea una diferencia notable).

creo que vale la pena Reiterando que este sólo funcionará si está utilizando UNION ALL en lugar de UNION - Esto es debido a que el número de filas se calcula antes de los duplicados se eliminan, lo que significa que obtendrá el mismo resultado de FOUND_ROWS() como lo haría si hubiera usado UNION ALL.

Cuestiones relacionadas