Consultas SQL para paginación
Cuando tenemos que mostrar una serie numerosa de resultados en nuestra página web, es necesario mostrar estos de poco en poco. Para ello se utiliza la paginación, dividir los resultados en grupos y mostrarlos en distintas páginas. Una parte fundamental es la consulta a la BD, la cual tiene que ser eficiente.
Un error que he visto con frecuencia en los proyectos que he participado, ha sido el de obtener todos los resultados y luego leer los que nos interesan, por ejemplo, si queremos los resultados de 21 al 30, empezamos a leer todos, se ignoran los 20 primeros y luego se guardan los 10 siguientes. Esto hace que en la BD recupere todos los datos y los envie, lo cual puede ser muy costoso. Por ello es necesario obtener de la BD solo los datos necesarios. Y tampoco, por favor, recupereís todos los datos y los guardéis en sesión para recuperarlos según necesitéis, porque los datos se modifican y la consulta puede quedar obsoleta.
En el caso de Mysql se usa la instruccion LIMIT (LIMIT posicion, desplazamiento):
SELECT *
FROM tabla
WHERE clausulas
LIMIT posicion, desplazamiento
Si la base de datos es Oracle, la instrucción LIMIT no existe, por lo que tendremos que simularlo mediante una subconsulta.
SELECT a, c, b, ...
FROM (SELECT ROWNUM fila, a, b, c, ...
FROM tabla
WHERE clausulas)
WHERE fila >= posicion AND
fila < posicion + desplazamiento
En este caso, lo que hacemos es obtener todos los datos, añadirle el número de fila, para introducirlo en una subconsulta y luego acceder a las filas según el número de fila.