En mysql para devolver un rango de resultados en una consulta podemos hacerlo usando el comando Limit de la siguiente forma:
Select * from tabla Limit 4,8
Esto nos devuelve un rango de 8 resultados desde el 4º encontrado
Apunté como hacerlo en Oracle, también como hacerlo en Microsoft SQL Server 2005/2008, y ahora lo apunto para SQL Server 2000.
SELECT TOP 10 t.* FROM tabla as t where t.id = not in
( SELECT TOP 0 id from tabla order by id desc )
order by t.id desc
El primer TOP, el principal, indica el número de tuplas a devolver.
El segundo TOP, en la subconsulta, debe ser multiplicar 10 por el número de página de resultados a mostrar menos 1, es decir: (número de página-1) x número de filas a devolver.
En ese ejemplo, el top para la subconsulta sería 0 para la primera página, 10 para la segunda, 20 para la tercera y así sucesivamente.
No es la query mas optima del mundo, y si estas en una pagina muy alta puede hacer sufrir mucho a tu BBDD. Ademas, si tienes los records ordenador por id no seria mas facil jugar con esos datos? Siempre es mejor que un NOT IN.
Al menos, pon un indice en el ID.
@Alberto no no lo es, soy consciente. En este caso hay que jugar con la cache y evitar hacer paginaciones numéricas.
Sql Server no contaba con la función row_number ni similar en la versión 2000.
Asier, muchas gracias por el artículo.
Eres un crack!
no funciona bien lo del top con id autonumericos.!!!!!!
SELECT TOP 10 t.* FROM tabla as t where t.id not in
( SELECT TOP 0 id from tabla order by id desc )
order by t.id desc
una pequeña modificacion, tenia un igual antes del “not in”
La consulta no funciona con el Order By DESC, en el caso de que el id sea autonumerico.
Solucionado… Se debe quitar el DESC del Order By