Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

limit

Estas en el tema de limit en el foro de Mysql en Foros del Web. Hola a todos, Tengo una consulta tengo una base de datos con más o menos 300 ingresos y quisiera mostrarlos en páginas de a 20 ...
  #1 (permalink)  
Antiguo 21/09/2015, 09:17
alvaro_trewhela
Invitado
 
Mensajes: n/a
Puntos:
limit

Hola a todos, Tengo una consulta tengo una base de datos con más o menos 300 ingresos y quisiera mostrarlos en páginas de a 20 ingresos, tengo entendido que se hace con limit, pero no lo entendí bien me podrían ayudar.

trabajo con php. por si necesitan ese dato para ayudarme

Gracias.
  #2 (permalink)  
Antiguo 21/09/2015, 09:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 15 años
Puntos: 2658
Respuesta: limit

LIMIT es la última clausula de un SELECT, e indica la cantidad de registros a devolver como resultado de una misma ejecución.
El uso es
Código MySQL:
Ver original
  1. ...
  2. LIMIT 0, 20

donde el primer dato es el offset, o cantidad de registros que avanzará el puntero antes de comenzar a devovler registros.
En el ejemplo, avanza cero lineas, y devuelve las 20 siguientes, lo que implica que devovlerá los registros 1 a 20 de la consulsta.

La siguiente consulta, para devolver los 20 posteriores, debería ser:
Código MySQL:
Ver original
  1. SELECT ...
  2. FROM ...
  3. LIMIT 20, 20
Luego de eso serán 40, 20 60,20 y así hasta terminar.

Cuando se usa a través de una aplicación, lo que deberías hacer es paginar por diferentes consultas, enviando cada vez a consultar el bloque que deseas.

¿Se entiende?

Esa parte (la del PHP), la deberás ver en el otro foro. En este no tratamos temas de programación, pero te puedo decir que podría implicar sencillamente hacer una consulta previa para saber con certeza cual es la cantidad total a leer, y luego guardas en un objeto de sesión la pagina que estás mostrando, para evaluar si puedes avanzar o retroceder.
Eso ya no est tema de este foro...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 22/09/2015, 13:50
alvaro_trewhela
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: limit

Gracias me sirvió

Tengo una consulta, deseo hacer esta consulta en mysql me podrias decir si esta bien o mal
Código MySQL:
Ver original
  1. SELECT * FROM productos
  2. WHERE alta='1'
  3. ORDER BY fecha DESC
  4. LIMIT 0,20

Última edición por gnzsoloyo; 22/09/2015 a las 14:01
  #4 (permalink)  
Antiguo 22/09/2015, 14:09
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 15 años, 11 meses
Puntos: 447
Respuesta: limit

Hola alvaro_trewhela:

La consulta no tiene ningún "problema" como tal, es decir, es sintácticamente correcta y por lo tanto no debe marcar ningún error al ejecutarse, sin embargo, si hay algunas cosas que pudieras hacer para mejorarla:

1. Evita siempre el uso de SELECT *, en lugar de eso, pon la lista de los campos que realmente vas a utilizar. Aun si fuera el caso y necesites TODOS LOS CAMPOS de tu tabla, es mejor poner la lista completa de estos, en lugar del asterisco. En la práctica, es muy raro que necesites acceder a todos los campos de una tabla, por lo general necesitas solo una parte de estos.

2. Si tu campo ALTA es de tipo numérico, entonces NO HAGAS COMPARACIONES CON CADENA ( alta = '1'), sino hazlas directamente como número (alta = 1). Al poner las comillas simples, estás forzando a MySQL a hacer conversiones implícitas, lo cual puede afectar el performance del servidor. Tampoco es conveniente que tengas campos declarados como VARCHAR si vas a almacenar sólo números. Esto es tan grave como querer manejar una fecha en un campo VARCHAR.

3. La cláusula ORDER BY es por si misma bastante lenta, por lo tanto, es conveniente que los campos que intervengan en este tipo de ordenaciones, sean a su ver declarados como ÍNDICES, de tal suerte que el proceso de ordenación sea un poco más rápido.

Saludos
Leo.
  #5 (permalink)  
Antiguo 22/09/2015, 14:12
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 15 años
Puntos: 2658
Respuesta: limit

No tiene errores sintácticos, si eso es lo que pregutnas.
Si, debes tener en cuenta dos cosas: 1) Las fechas deben estar en un campo DATE, DATETIME o TIMESTAMP. Ningun otro funciona con fechas; y 2) EL ORDER BY con uso de LIMIT puede causar algunos resultados raros.
Cita:
If you combine LIMIT row_count with ORDER BY, MySQL ends the sorting as soon as it has found the first row_count rows of the sorted result, rather than sorting the entire result. If ordering is done by using an index, this is very fast. If a filesort must be done, all rows that match the query without the LIMIT clause are selected, and most or all of them are sorted, before the first row_count are found. After the initial rows have been found, MySQL does not sort any remainder of the result set.

One manifestation of this behavior is that an ORDER BY query with and without LIMIT may return rows in different order, as described later in this section.
En esencia, el LIMIT actúa con mayor prioridad que el ORDER BY, es decir, puede no haber ordenado el total de resultados posibles, antes de devolver los registros pedidos.
En ese caso lo mejor es usar el SELECT con ORDER BY como tabla derivada:
Código MySQL:
Ver original
  1. FROM (SELECT * FROM productos
  2.     WHERE alta='1'
  3.     ORDER BY fecha DESC) Tabla
  4. LIMIT 0,20
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: limit, php
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:22.