944 063 154

Blog

Crear una consulta select count relativa a una select con PHP

Publicado enDesarrollo web

En alguna situación concreta, es posible que necesitemos hacer una consulta select count. Especialmente cuando queremos hacer listados con consultas que tienen muchos joins, condiciones where, orders o similares. Por supuesto, para realizar las paginaciones, es necesario que posteriormente cacheemos dichas consultas.

Si generamos este tipo de consulta select count de forma dinámica lo habitual es hacer un count contra una subquery. Una subquery que sea esa misma consulta pero sin los limits. Algo parecido a esto y que 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 hacer uso de las funciones strrpos y substr de PHP. Estas funciones se encargan de encontrar la última coincidencia de una cadena o carácter en una cadena dada. Cuando la han localizado, parten esa cadena dada según unos límites que hayamos establecido previamente.

De esta forma podemos tener una consulta count para nuestra query principal, sin tener que reescribir lo mismo dos veces.

En primer lugar, tenemos que eliminar todos los caracteres en una cadena contenida en $query. Desde el final, hasta la última coincidencia de la palabra ORDER. Es decir, contando desde el principio. Esto hará que eliminemos de la query original los últimos ORDERs y LIMITs.


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

Seguidamente, eliminamos todos desde el principio de la query hasta el último FROM que se haya encontrado:


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

Finalmente, tendremos que agregar la sentencia COUNT a la query


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

De esta forma, podremos crear este tipo de consultas en PHP de una forma limpia y ordenada. Además, el rendimiento de la web o el servidor no se verá afectado.