En alguna situación, sobre todo cuando necesito hacer listados con consultas que tienen muchos joins, condiciones where, orders y similares, necesito hacer una consulta count (que por supuesto posteriormente cacheo) para realizar las paginaciones.
Si generamos este tipo de consultas dinámicamente, lo habitual y desaconsejado consiste en hacer un count contra una subquery que sea esa misma consulta pero sin los limits:
SELECT count(*) FROM ( SELECT ...la query sin los limits) as tuplas
Esto puede ocasionar serios problemas de rendimiento, sobre todo si la consulta contiene cláusulas de tipo ORDER.
Para mejorar esto podemos hacer uso de las funciones strrpos y substr de php, que encuentran la última coincidencia de una cadena o caracter en una cadena dada y parten esa cadena dada según unos límites que establezcamos.
De esta forma podemos tener una consulta count para nuestra query principal, sin tener que reescribir lo mismo dos veces.
/* eliminamos todos los caracteres en una cadena contenida en $query desde el final hasta la última coincidencia de la palabra ORDER (contando desde el principio) Esto hace que eliminemos de la query original los últimos ORDERs y LIMITs */ $count_query = substr($query,0,strrpos($query,"ORDER")); /* Eliminamos todo desde el pincipio de la query hasta el último FROM encontrado */ $count_query = substr($count_query,strrpos($count_query,"FROM"),strlen($count_query)); /* Agregamos la sentencia COUNT a la query */ $count_query = "SELECT COUNT(*) as total ".$count_query;
— Posted by Asier Marqués | Posted in Desarrollo web | Posted on February 9, 2010



