944 063 154

Blog

Crear una consulta select count a una select con PHP

Publicado enDesarrollo y Programación

En alguna situación concreta, es posible que necesitemos hacer una consulta del tipo select count. 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 una paginación; en este caso, además, será necesario que posteriormente cachees dichas consultas.

Cada vez que 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 pero sin 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

Consultando mediante funciones

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 $query. Desde el final 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, 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 ordenada. Todo ello sin que el rendimiento de la web o del servidor pueda verse afectado.