Crear una consulta select count a una select con PHP

Es posible que en alguna situación concreta necesitemos hacer una consulta del tipo select count en PHP. Algo que es especialmente útil cuando queremos hacer listados con consultas que tienen muchos elementos; como joins, condiciones, where, orders o similares. También es posible que lo que quieras sea realizar en el sitio web sea una paginación. En este caso, además de realizar las consultas correspondientes, será necesario que posteriormente te asegures de cachear cada una de ellas.

Cuando generamos este tipo de consulta select count de forma dinámica, lo habitual es que hagamos un count contra una subquery. Una subquery que sea esa misma consulta que queremos realizar, pero a la que le quitaremos todos los limits. Algo parecido al script que te mostramos a continuación y cuyo uso, en este momento, está totalmente desaconsejado:


SELECT count(*) FROM ( SELECT ...la query sin los limits) as tuplas

Consulta select count

Esto puede ocasionar serios problemas de rendimiento, sobre todo si la consulta contiene, por ejemplo, cláusulas de tipo ORDER. Para mejorar esto podemos recurrir al uso de las funciones strrpos y substr de PHP. Unas funciones que se encargan de encontrar cuál es la última coincidencia dentro de una cadena o cuál es el carácter en una cadena que nos ha sido dada. Una vez que las funciones han localizado esta coincidencia, la cadena se partirá en función de los límites que hayamos establecido previamente. El uso de estas funciones nos permiten tener una consulta count para nuestra query principal, sin tener que reescribir lo mismo dos veces.

Para ello, en primer lugar, tenemos que eliminar todos los caracteres en una cadena contenida en la $query. Desde el principio hasta la última coincidencia que se encuentre de la palabra ORDER. Es decir, contando desde el principio hasta el final de una misma cadena. Recurrir a este tipo de funciones hará que se elimine de la query original los últimos ORDERs y LIMITs. Algo similar al script que te mostramos a continuación:


*/ $count_query = substr($query,0,strrpos($query,"ORDER"));

Seguidamente, deberemos eliminar desde el principio de la query hasta el último FROM que se haya encontrado al hacer uso de dichas funciones. Es decir, algo como lo siguiente:


*/ $count_query = substr($count_query,strrpos($count_query,"FROM"),strlen($count_query));

Finalmente, tendremos que agregar la sentencia COUNT a la query. Para ello, puedes recurrir a un script como el que te mostramos a continuación:


*/ $count_query = "SELECT COUNT(*) as total ".$count_query;

De esta forma, la creación de este tipo de consultas en PHP se realizará de una forma mucho más limpia y, sobre todo, ordenada. Todo ello sin que el rendimiento de la web o del servidor pueda verse afectado.

Nuestro sitio web utiliza cookies para mejorar la navegación y obtener datos estadísticos sobre las visitas obtenidas.

Leer más