Buscar el número total de resultados en la consulta MySQL con offset + limit


Estoy haciendo una función de paginación usando Codeigniter pero creo que esto se aplica a la codificación PHP/MySQL en general.

Estoy recuperando listados de directorios usando offset y limit dependiendo de cuántos resultados quiero por página. Sin embargo, para saber el número total de páginas requeridas, necesito saber (número total de resultados)/(límite). En este momento estoy pensando en ejecutar la consulta SQL una segunda vez y luego contar el número de filas requeridas pero sin usar LÍMITE. Pero creo que esto parece ser un desperdicio de recursos computacionales.

¿Hay alguna manera mejor? ¡Gracias!

EDITAR: Mi consulta SQL utiliza WHERE también para seleccionar todas las filas con un 'category_id' particular

Author: Ivar, 2011-05-08

4 answers

Echa un vistazo a SQL_CALC_FOUND_ROWS

 29
Author: Dr.Molle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-08 16:41:09

SELECT COUNT(*) FROM table_name WHERE column = 'value' devolverá el número total de registros en una tabla que coincida con esa condición muy rápidamente.

Las operaciones de la base de datos SELECT suelen ser "baratas" (en términos de recursos), así que no se sienta tan mal por usarlas de una manera razonable.

EDITAR: Se agregó WHERE después de que el OP mencionara que necesitan esa característica.

 6
Author: Austin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-08 16:31:57

Considerando que SQL_CALC_FOUND_ROWS requiere invocar FOUND_ROWS() después, si desea obtener el recuento total con los resultados devueltos desde su límite sin tener que invocar un segundo SELECT, usaría JOIN resultados derivados de una subconsulta :

SELECT * FROM `table` JOIN (SELECT COUNT(*) FROM `table` WHERE `category_id` = 9) t2 WHERE `category_id` = 9 LIMIT 50

Nota: Cada tabla derivada debe tener su propio alias, así que asegúrese de nombrar la tabla unida. En mi ejemplo usé t2.

 2
Author: Daerik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-14 20:13:47
SELECT COUNT(id) FROM `table` WHERE `category_id` = 9

Le da el número de filas para su categoría específica.

 -1
Author: Tom Claus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-08 16:18:31