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

[SOLUCIONADO] consulta sobre mysql

Estas en el tema de consulta sobre mysql en el foro de Mysql en Foros del Web. buenas tardes, espero estén bien y me puedan ayudar, tengo una aplicación que muestra carros para la venta, y cuando una persona visita la pagina, ...
  #1 (permalink)  
Antiguo 02/07/2014, 11:53
Avatar de andresbetancourt  
Fecha de Ingreso: julio-2008
Ubicación: colombia
Mensajes: 334
Antigüedad: 16 años, 4 meses
Puntos: 2
consulta sobre mysql

buenas tardes,

espero estén bien y me puedan ayudar, tengo una aplicación que muestra carros para la venta, y cuando una persona visita la pagina, en la pagina principal se muestran 12 carros y abajo de la cuadricula se muestran las demás paginas para que el usuario navegue y vaya mirando los demás carros, es decir, uso paginación de 12 en 12.

todo eso funciona, lo que necesito hacer es lo siguiente:

que los carros se muestren de forma aleatoria, asi se logrará que no siempre se muestren en la primer pagina los mismo carros.

lo que he realizado para esto es lo siguiente:

cree una vista en mysql cuyo select usa order by rand() sobre la tabla tbl_carro que contiene los carros; hasta allí todo funciona bien, y posteriormente hago las consultas sobre la vista con limit de 12 registros, asi logro mostrar de 12 en 12 para cada página, el problema esta en que cada vez qeu consulto sobre la vista de 12 en 12, osea el primer select de la primer pagina va de 1 a 12 registros, luego de 13 al 24...; la vista vuelve y se ejecuta haciendo un select randonico y lo anterior ocasiona que cuando se navega por todas las paginas, en ocasiones se presenten carros repetidos que ya habian aparecido en una pagina anterior.

agradezco me den una idea de como lograr presentar los carros de forma randonica en la paginación, logrando mostrarlos todos, sin repetir y sin dejar alguno por fuera.

gracias
__________________
http://tecnologiaco.com/
  #2 (permalink)  
Antiguo 02/07/2014, 12:55
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: consulta sobre mysql

Una vista es un aconsulta que se ejecuta neuvamente cada vez que se invoca a la misma, y por consecuencia siempre se refrescará, dando lugar a la posibilidad de que los mismos registros aparezcan en cada llamada.
Eso es inevitable, tal como lo has hecho, y es el comportameinto normal my esperable.

La única posibilidad que veo es, o bien excluir los ID de los que ya se mostraron en cada nueva consulta, o bien realizar dos consultas:
- En la primera obtienes todos los IDs de los registros, ordenados aleatoriamente, pero sólo los ID. Nada más.
- La segunda consulta y subsiguientes, la realizas con la clausula ORDER BY y usando la función FIELD() sobre el campo de ID, y le pasas como parámetro el segmento de bloque de IDs, según se necesite.
Lo que NO puedes hacer es poner en ese caso el ORDER BY RAND() en la vista. No sirve. No es funcional.

O sea, la vista sería una vista normal
Código MySQL:
Ver original
  1. CREATE OR REPLACE VIEW vistaProductos
  2. SELECT id, a, b, c, d, e
  3. FROM tabla;

Luego haces un
Código MySQL:
Ver original
  1. FROM vistaproductos
Con el resultado de eso, luego creas programaticamente las llamadas a la misma vista, pero con un segmento de los IDs obtenidos, por ejemplo, diexz de ellos, tal que la query quede armada así:
Código MySQL:
Ver original
  1. FROM vistaproductos
  2. WHERE id IN(ID, 23, 185, 6, 91, 47, 11, 3, 99, 68, 325)
  3. ORDER BY FIELD(ID, 23, 185, 6, 91, 47, 11, 3, 99, 68, 325);

¿Se entiende la idea?
__________________
¿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 02/07/2014, 13:04
Avatar de andresbetancourt  
Fecha de Ingreso: julio-2008
Ubicación: colombia
Mensajes: 334
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: consulta sobre mysql

se entiende perfectamente, muuuuchas gracias por tu explicación, en ese caso ya no usare la vista porque ya existe una tabla que tiene esa información. no conocia la funcion fiel()

sin embargo, estaba pensando manejar esa logica en el lenguaje de programacíón, en este caso php, lo anterior para no sobrecargar la bd contantas consultas, y más teniendo en cuenta que esa es la pagina principal donde se muestra a los usuarios visitantes todos los carros paginados.

que piensas?
__________________
http://tecnologiaco.com/
  #4 (permalink)  
Antiguo 02/07/2014, 13:20
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: consulta sobre mysql

Pienso que obtener la lisyta de IDs ordenados aleatoriamente es más sencillo para la base. Además, siendo sólo valores numéricos, será rápido, y no necesitarás hacer nada más que recorrer el resultado en programación.
Creo que con las dos queries será suficiente para lograrlo y con buena performance.

Pruebalo...
__________________
¿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 02/07/2014, 19:00
Avatar de andresbetancourt  
Fecha de Ingreso: julio-2008
Ubicación: colombia
Mensajes: 334
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: consulta sobre mysql

muchas gracias gnzsoloyo por tu gran ayuda, voy a hacer lo que me dices, lo hare asi:

1. selecciono los id de los vehiculos los cuales estan en una columna autoincremental, los seleccionare de forma randonica

2. almacenare los id en un arreglo de php

3. ire cogiendo de doce en doce para hacer la consulta de paginación

gracias
__________________
http://tecnologiaco.com/

Etiquetas: select, vista
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 12:07.