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

Subquery in LIMIT

Estas en el tema de Subquery in LIMIT en el foro de Bases de Datos General en Foros del Web. Hola quiero hacer esto en mysql, ya lo intente de las siguientes formas pero no he podido @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original SELECT * ...
  #1 (permalink)  
Antiguo 26/01/2011, 21:20
 
Fecha de Ingreso: enero-2011
Mensajes: 14
Antigüedad: 13 años, 10 meses
Puntos: 0
Subquery in LIMIT

Hola quiero hacer esto en mysql, ya lo intente de las siguientes formas pero no he podido

Código MySQL:
Ver original
  1. SELECT * FROM inventario LIMIT (SELECT (count( * ) DIV 10) FROM `inventario` WHERE `id` < '5'), 10


Código MySQL:
Ver original
  1. SELECT @A:=(count( * ) DIV 10) FROM `inventario` WHERE `id` < '5'
  2. SELECT * FROM inventario LIMIT @A, 10

Código MySQL:
Ver original
  1. SELECT (count( * ) DIV 10) AS algo FROM `inventario` WHERE `id` < '5';
  2. SELECT * FROM inventario LIMIT algo, 10

Porque no me funciona?, saludos, y gracias de antemano

Última edición por MyPHP; 26/01/2011 a las 21:41
  #2 (permalink)  
Antiguo 27/01/2011, 03:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Subquery in LIMIT

Porque los parámetros de LIMIT deben ser valores enteros reales y no variables o parámetros de ningún tipo. Simplemente MySQL no admite nada que tenga que evaluar.
__________________
¿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 27/01/2011, 09:56
 
Fecha de Ingreso: febrero-2005
Mensajes: 626
Antigüedad: 19 años, 9 meses
Puntos: 10
Respuesta: Subquery in LIMIT

Finalmente opte por hacer esto

Código MySQL:
Ver original
  1. SELECT @t:=(count( * ) DIV 10) FROM `inventario` WHERE `id` < '5';
  2. SELECT * FROM inventario WHERE `id`>@t LIMIT 0,10

Supongo que WHERE es mas lento que LIMIT, entonces me recomendarias, hacerlo en consulta separadas, estoy trabajando en php, entonces primeramente me recomiendas guardar en una variable PHP la consulta con COUNT y esa variable hacer una segunda consulta y meterla en SELECT * FROM inventario LIMIT $variablephp, 10, aunque aqui son dos consulta en lugar de una o sea tenga las siguiente dos opciones

1)UNA SOLO CONSULTA con subconsultas usando dos WHERE, como lo puse en este post


2)DOS CONSULTAS una para el count y guardarlo en una variable PHP, para meterlo en el LIMIT

Código PHP:
Ver original
  1. consulta 1 SELECT (count( * ) DIV 10) AS algo FROM `inventario` WHERE `id` < '5'
  2. consulta 2 SELECT * FROM inventario LIMIT $variablephp, 10



Gracias
Que me recomiendas?

Última edición por August; 27/01/2011 a las 10:01
  #4 (permalink)  
Antiguo 27/01/2011, 10:07
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Subquery in LIMIT

Que expliques dos cosas:
Primero, que me aclares qué es lo que quieres obtener con la primera consulta. Es decir, ¿cuál es el sentido de toda esta operación? ¿Paginar de algún modo u obtener algún rango basado en qué?
Segundo, ¿Eres la misma persona que inició el post? Porque yo le estaba respondiendo a MyPHP...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 27/01/2011, 10:19
 
Fecha de Ingreso: febrero-2005
Mensajes: 626
Antigüedad: 19 años, 9 meses
Puntos: 10
Respuesta: Subquery in LIMIT

jejeje, es que somos dos personas que estamos trabajando juntos, en un proyectito

si es una paginacion, hecha con ajax, has de cuenta que le damos en borrar y se borra, pero a veces la paginacion ya no coincide con una de las capas, (eliminamos 10 campos y todavia aparecen las mismas paginas) entonces estamos haciendo esto, para que la paginacion funcione bien y ya con esto funciona todo bien

pero tenemos la duda, que te plantee, que sera mas eficiente

2 consultas con un WHERE y un LIMIT o
1 consulta con una subconsulta de dos WHERE

Pensando en que dos accesos a la Base de datos son mas gastolones y dos WHERE son mas gastolones que un WHERE y un LIMIT
  #6 (permalink)  
Antiguo 27/01/2011, 10:54
 
Fecha de Ingreso: enero-2011
Mensajes: 14
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Subquery in LIMIT

Disculpa la molestia, tambien yo queria aclarar el asunto y disculpen que los dos hayamos participado en el tema, si nos podrian contestar nuestra duda, la que expuso August

Saludos y gracias de antemano
  #7 (permalink)  
Antiguo 27/01/2011, 11:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Subquery in LIMIT

OK.
De todos modos no has contestado mi pregunta.
Esta operación:
Cita:
(count( * ) DIV 10)
¿qué valor representa el resultado?
¿La cantidad de registros a saltar?
¿La cantidad de registros por página?
Los registros que se borraron y que deben ser reemplazados por otros?

Según lo que me diga, te podríamos sugerir que más que una consulta o dos, o diferentes WHEREs, bien pudiera resolverse con una sentencia mejor elaborada.

En bases de datos no existe el "haz de cuenta que...". Cada caso puede requerir una sintaxis distinta para ser óptima para el uso que se necesita resolver.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 27/01/2011, 11:56
 
Fecha de Ingreso: enero-2011
Mensajes: 14
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Subquery in LIMIT

De la primera consulta

Código MySQL:
Ver original
  1. WHERE `id` < '$variablephp'
aqui le pongo el campo que se elimino, entonces solo me va a devolver los id menores a ese campo,

Cuento los campos, si son 5 y los divido entre 10, donde 10 es el numero de elementos que se mustran por pagina, me va a devolver siempre un entero, porque DIV siempre devuelve enteros, entonces es 0, debe paginarme desde 0

si es 17 el eliminado entre 10, me da 1, entonces me pagina desde 1 y asi sucesivamente
Código MySQL:
Ver original
  1. (count( * ) DIV 10)*10

Olvide que todavia el resultado, lo debo multiplicar por 10, para que @t valga 0,10,20,30,etc si uso esto y a paginar en bloques de 10, empezando de 0 al fin el id va a decirle desde que id debe empezar:
Código PHP:
Ver original
  1. SELECT * FROM inventario WHERE `id`>@t LIMIT 0,10
o en el otro caso, la $variablephp va a tener el valor de @a
Código MySQL:
Ver original
  1. SELECT * FROM inventario LIMIT $variablephp, 10

Ahora con respecto a la eliminacion del campo id, se usa innoDB pero no usamos Foreign Keys, seria muy util "reorganizar el indice" o sea que el siguiente campo, ocupara el lugar del que se elimino, ya he leido que anteriormente habias dicho que esto no es conveniente, por las razones que explicaste, aunque si te fijas, usando esto, no hay problema, muestra 10 campos, sin importar si faltan 5 campos del 0 al 10 por ejemplo, aunque seria interezante por razones ilustrativas/didacticas saber como se reorganiza un indice

Código PHP:
Ver original
  1. SELECT * FROM inventario WHERE `id`>@t LIMIT 0,10

Saludos
  #9 (permalink)  
Antiguo 27/01/2011, 14:52
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Subquery in LIMIT

Simplificando:
Ustedes tienen una aplicación que muestra datos paginados cada 10 registros. Eventualmente, el usuario puede borrar algunos de ellos, y lo que desean es que refresque la información de modo que si la acción se realiza en las páginas medias o inicial de las que se muestran, se vuelva a leer lo restante a partir de esa misma página.
Bien. Hay varias formas de verlo, pero a mi entender están complicando demasiado un problema que parece muy sencillo.

Suponiendo que la acción de borrado tiene efecto inmediato en la base:
- Si la aplicación contiene un numero fijo de páginas, no hace falta consultar nada. Basta con multiplicar por diez el número de la página en que está el usuario en ese momento y pasarlo como parámetro a la sentencia que se construye. Ni siquiera requiere el uso de variables de usuario, sino simplemente construir la sentencia SQL con ese valor dado.
Código MySQL:
Ver original
  1. SELECT * FROM tabla LIMIT $valor, 10;

- Si el paginado no se mantiene, sino que sólo muestra el segmento consultado, pueden darse cuatro situaciones:
1) se borró el inicio de la tabla,
2) se borró el final de la tabla,
3) se borró el medio de la tabla,
4) Se borró toda la tabla.
Para resolver todos estos casos se necesita nada más que cuando se leyera la tabla, se lean (aunque no se representen) la/s columna/s que sea/n la PK de la tabla.
En el primero, segundo y tercer caso, se debe usar simplemente la PK que corresponde al primer registro restante.
Código MySQL:
Ver original
  1. SELECT * FROM tabla WHERE id >= $valor LIMIT 10;
En el cuarto caso se debe conservar momentáneamente en una variable el valor del último registro y pedir los mayores a:
Código MySQL:
Ver original
  1. SELECT * FROM tabla WHERE id > $valor LIMIT 10;

Yo no le veo sentido, si se construye la sentencia en forma dinámica, en tener que usar sentencias más complejas que eso. Y menos usar dos para lograrlo.

Ahora bien, si y sólo si el borrado de los registros no es físico en la base, puede requerirse un campo de estado en la tabla que determine si es accesible o no para lectura.

¿Es borrado físico o lógico?
__________________
¿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, subquery
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 11:32.