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

[SOLUCIONADO] Duda con ASC LIMIT

Estas en el tema de Duda con ASC LIMIT en el foro de Mysql en Foros del Web. Hola, les dejo lo que estoy usando, algo debo estar haciendo mal, quizás mi razonamiento esta mal, espero puedan enfocarme. Tengo base de datos mysql ...
  #1 (permalink)  
Antiguo 28/05/2015, 08:46
Avatar de FaNaTyCk  
Fecha de Ingreso: enero-2008
Mensajes: 54
Antigüedad: 16 años, 3 meses
Puntos: 2
Pregunta Duda con ASC LIMIT

Hola, les dejo lo que estoy usando, algo debo estar haciendo mal, quizás mi razonamiento esta mal, espero puedan enfocarme.

Tengo base de datos mysql A y B

En la A, consulto el ultimo id:

Código MySQL:
Ver original
  1. SELECT `premium_id` FROM `active` ORDER BY `active`.`premium_id` DESC LIMIT 1

Supongo que se puede optimizar con el last_insert_id http://dev.mysql.com/doc/refman/5.0/...last-insert-id

Pero de momento eso no me preocupa. El resultado es el siguiente:



El resultado lo cargo en una variable ejemplo
Cita:
Editado: Codigo de programacion no permitido en foros de BBDD.
Luego en la base de datos B (aquí la falla), genero la siguiente query para seleccionar los últimos 5 insert que encuentre a partir del id de la base A:

Código MySQL:
Ver original
  1. SELECT * FROM `active` ORDER BY `active`.`premium_id` ASC LIMIT $last_id , 5

El resultado es el siguiente:


Esta base B, el ultimo insert es 384, por lo tal debería devolverme resultados según entiendo.

¿Cual es mi falla?.

Última edición por gnzsoloyo; 28/05/2015 a las 09:03
  #2 (permalink)  
Antiguo 28/05/2015, 09:14
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Duda con ASC LIMIT

Cita:
Esta base B, el ultimo insert es 384, por lo tal debería devolverme resultados según entiendo.
No, no estás entendiendo el uso de LIMIT....

Es una pregunta para leer el manual, pero te lo explico así:
1) LIMIT no es una clausula de ASC, ni nada parecido. ASC sólo aplica a ORDER BY, y LIMIT es una clausula separada que debe ser la última clausula de la sentencia, si es que la necesitas.
2) LIMIT tiene dos parámetris, uno opcional y otro mandatorio:
Código MySQL:
Ver original
  1. LIMIT [offset,] numberRows
"NumberRow", en este caso, es el numero de registros que se devolverá, y si no se encuentra el offset, serán los primeros numberRow registros:
Código MySQL:
Ver original
  1. ...
devuelve 5 registros

Si se presenta el parámetro que acá indico como "offset", representa la cantidad de registros que se contarán antes de comenzar a tomar registros.
Código MySQL:
Ver original
  1. ...
  2. LIMIT 12, 5
desplaza el contador interno de registros 12 posiciones y devuelve los registros del 13 en adelante.
¿Se entiende?

Cuando pones en la sentencia
Código MySQL:
Ver original
  1. ...
  2. LIMIT 382, 5
le estás pidiendo que descarte los primeros 382 regoistros que obtiene, y te devuelva los cinco siguientes.

Ahora bien, no solo eso está mal, además debes tener en cuenta que los registros que verificará, en el caso de tener una columna autoincrementada, no son los numeros de esa columna, sino los registros devueltos por la consulta.
Esto quiere decir que si se hubiesen eliminado 150 registros intermedios entre el 1 y el 382, la consulta devolvería recién aquellos que existan, y verás que el primero de los cinco registros comenzará con 533...

Nota final: Recuerda lo que dije: ASC no tiene nada que ver con LIMIT. Lo que sí puede pasar es que el resultado del LIMIT de la consulta en general quede afectado por el ORDER BY...
Pero ese es otro tema.
__________________
¿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 28/05/2015, 09:28
Avatar de FaNaTyCk  
Fecha de Ingreso: enero-2008
Mensajes: 54
Antigüedad: 16 años, 3 meses
Puntos: 2
Respuesta: Duda con ASC LIMIT

Gracias @gnzsoloyo , quizás me exprese mal, entendía que eran 2 cosas diferentes, y como funcionaban, lo que no sabia era eso de los registros eliminados..

db A:


db B:


Cada tanto tenemos un cron corriendo en linux que elimina los id con fecha expirada de 30 dias.

Tenemos una base de datos global, y mini dbs en diferentes servidores pequeños en distinta ubicación, básicamente lo que hacemos es clonar la tabla, para que la consulta sea local y no de país a país con 300ms .. o más.

¿Que puedo utilizar para evitar esto que me explicas?.
  #4 (permalink)  
Antiguo 28/05/2015, 09:39
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Duda con ASC LIMIT

Cita:
¿Que puedo utilizar para evitar esto que me explicas?.
Si lo que necesitas es encontrar los X registros posteriores a un ID dado, la consulta es básica hasta lo elemental...
Código MySQL:
Ver original
  1. FROM `active`
  2. WHERE `premium_id`> 382
  3. ORDER BY `premium_id` ASC
No tiene ninguna utilidad usar un OFFSET, si ya sabes cuál es el limite inferior del rango que buscarás.
__________________
¿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: desc, limit, query
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 23:48.