2008-12-13 14 views
54

Tengo una pregunta al efecto deConseguir el número de filas de una consulta GROUP BY

SELECT t3.id, a,bunch,of,other,stuff FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id 
LIMIT 10,20 

Quiero saber a muchas filas totales Esta consulta sin el límite (para que pueda mostrar la información de paginación)

Normalmente, me gustaría utilizar esta consulta:

SELECT COUNT(t3.id) FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id 

Sin embargo, el GRUPO POR cambia el significado de la cuenta, y en lugar de eso obtener un conjunto de filas que representan el número de valores únicos t3.id en cada grupo .

¿Hay alguna manera de obtener un conteo por el número total de filas cuando uso un GROUP BY? Me gustaría evitar tener que ejecutar toda la consulta y solo contar el número de filas, ya que solo necesito un subconjunto de las filas porque los valores están paginados. Estoy usando MySQL 5, pero creo que es bastante genérico.

+0

[Utilice subconsultas para contar distinto 50 veces más rápido.] (Https: // www.periscopedata.com/blog/use-subqueries-to-count-distinct-50x-faster.html) – bishop

Respuesta

53

No es una buena solución en MySQL.

Añadir los SQL_CALC_FOUND_ROWS de palabras clave justo después de la palabra clave SELECT:

SELECT SQL_CALC_FOUND_ROWS t3.id, a,bunch,of,other,stuff FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id 
LIMIT 10,20 

Después de eso, ejecute otra consulta con los FOUND_ROWS función():

SELECT FOUND_ROWS(); 

debe devolver el número de filas sin el Cláusula LIMIT.

Pedido esta página para obtener más información: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

+3

Con la cláusula de exención de responsabilidad de no haber evaluado las llamadas yo mismo, este artículo me desconectó de la solución: http: // www .mysqlperformanceblog.com/2007/08/28/a-sql_calc_found_rows-or-not-to-sql_calc_found_rows/ –

+0

En lugar de ejecutar múltiples consultas, http://stackoverflow.com/a/364838/631652 para la respuesta de Tom. – Parixit

50

son el "montón de otras cosas" todos los agregados? Supongo que sí, ya que su GROUP BY solo tiene t3.id. Si ese es el caso, entonces esto debería funcionar:

SELECT 
    COUNT(DISTINCT t3.id) 
FROM... 

La otra opción, por supuesto, es:

SELECT 
    COUNT(*) 
FROM 
    (
    <Your query here> 
    ) AS SQ 

no uso de MySQL, así que no sé si estas consultas van a trabajar allí o no.

+2

En MySQL esto funcionará, pero podría ser una buena solución si agrega un alias para la tabla generada. De lo contrario, obtendrá el error: "Cada tabla derivada debe tener su propio alias". Así que asegúrese de escribir algo como: seleccionar conteo (*) de (su consulta) como resultTable – Kennethvr

+0

Gracias por el aviso. He hecho la edición. –

+5

funciona en MySQL para mí. – quano

12

Uso de sub consultas:

SELECT COUNT(*) FROM  
(
SELECT t3.id, a,bunch,of,other,stuff FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id 
)  
as temp; 

manera temporal contiene el recuento de filas.

1

Todas las respuestas dadas ejecutarán la consulta y luego buscarán el conteo. Distinto es definitivamente más lento que agrupar por conjunto de datos grandes.

mejor manera de encontrar el recuento de grupo por debajo es

SELECT 
    sum(1) as counttotal 
FROM (
    Your query with group by operator 
) as T 

Esto encontrará el conteo mientras que el cálculo agrupar.