jueves, 6 de mayo de 2010

PostgreSQL: Encontrar el número total de filas antes de aplicar LIMIT / OFFSET

Cuando publicamos un resultado de una consulta, sobre todo en Web, lo deseable es paginar los registros obtenidos, pues presenta al usuario un numero representativos de registros, evitamos el excesivo trafico de datos, demoras y cuelgues tanto en el cliente como en el servidor. El problema es que al realizar la consulta también es deseable obtener cuantos registro cumple con las condiciones establecidas, por lo tanto, por un lado queremos obtener la cantidad total de datos que cumplen las condiciones y además, presentar una muestra paginada del detalle de los mismos. eso directamente requeriría ejecutar la consulta completa sustituyendo los campos iniciales de SELECT por un COUNT(*) para obtener la cantidad total de registros y a continuación ejecutar la consulta con el respectivo LIMIT, penalizando el tiempo y recursos si la consulta resulta ser demorada. En PosgreSQL es posible salvar este inconveniente de la siguiente forma:

WITH consulta AS (nuestra_consulta),
cuanto(cantidad) AS (SELECT COUNT(*) as cantidad FROM consulta)
SELECT b.*,a.cantidad FROM cuanto a, consulta b LIMIT tamaño_pagina OFFSET rango;

Ejemplo

Obtener la cantidad total de registros y los primeros 20 resultados de una consulta sobre la tabla proyectos, la consulta seria así

WITH consulta AS (SELECT id,nombre,fecha FROM proyecto),
cuanto(cantidad) AS (SELECT COUNT(*) as cantidad FROM consulta)
SELECT b.*,a.cantidad FROM cuanto a, consulta b LIMIT 20 OFFSET 0;






La ultima columna contiene la cantidad total de registros que se obtiene con la consulta.