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

ordenar por precio ascendente y descendente

Estas en el tema de ordenar por precio ascendente y descendente en el foro de Mysql en Foros del Web. hola, escribo porque tengo un problema al ordenar precios de productos. entiendo que es tan siemple como colocar order by. Mi problema paasa por algo ...
  #1 (permalink)  
Antiguo 21/06/2009, 15:31
 
Fecha de Ingreso: diciembre-2002
Ubicación: arica 3334
Mensajes: 75
Antigüedad: 21 años, 4 meses
Puntos: 0
Pregunta ordenar por precio ascendente y descendente

hola, escribo porque tengo un problema al ordenar precios de productos.
entiendo que es tan siemple como colocar order by.
Mi problema paasa por algo más complejo que eso.
Tengo 2 tablas:
productos: con el detalle y los precios en valores enteros, sin puntos ni comas.
Puedo ordenarlos bien y todo.
pero tengo otra tabla:
ofertas.
resulta que ofertas tiene un campo llamado descuento además de tener el id_producto para ver a que producto se le aplica el descuento.

La cosa es que cuando coloco order by precio, solo ordena los precios en base a la tabla productos donde el valor esta sin el descuento.

Como hago para que se ordene en base a los precios de productos y además vea si tiene un descuento y en base a ese descuento se reordene?

Es posible hacer algo como eso?
Como lo hago?

Saludos
__________________
Rodrigo Lopez
  #2 (permalink)  
Antiguo 21/06/2009, 15: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: 16 años, 5 meses
Puntos: 2658
Respuesta: ordenar por precio ascendente y descendente

El ORDER BY admite que cada campo indicado tenga una forma de ordenamiento diferente:
Supongamos:
Código sql:
Ver original
  1. SELECT producto_id, descripcio, precio, IFNULL(descuento,0) descuento
  2. FROM producto LEFT JOIN descuentos USING(producto_id)
  3. ORDER BY precio ASC, descuento DESC;
Esto ordena la lista de productos por precio en forma ascendente, y por descuento en forma descendente.
En general, esta forma es ineficiente en un listado de precios, porque como cada producto aparece solamente una vez, la segunda condición de ordenamiento sólo operará en los productos que tengan el mismo precio.
Si quieres ordenar por descuento primero y por precio después, entonces será:
Código sql:
Ver original
  1. SELECT producto_id, descripcio, precio, IFNULL(descuento,0) descuento
  2. FROM producto LEFT JOIN descuentos USING(producto_id)
  3. ORDER BY descuento DESC, precio ASC;
Quitarle las cláusulas de forma de ordenamiento, hace que se ordenen en forma ascendente:
Código sql:
Ver original
  1. SELECT producto_id, descripcio, precio, IFNULL(descuento,0) descuento
  2. FROM producto LEFT JOIN descuentos USING(producto_id)
  3. ORDER BY descuento, precio;

El IFNULL() pondrá ceros donde la relación entre producto y descuento de NULL.
¿Te sirve 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 21/06/2009, 16:04
 
Fecha de Ingreso: diciembre-2002
Ubicación: arica 3334
Mensajes: 75
Antigüedad: 21 años, 4 meses
Puntos: 0
Respuesta: ordenar por precio ascendente y descendente

mmm buscare acerca de ifnull...
ahora mi duda es que el descuento es un campo de la tabla descuentos que guarda el porcentaje.
no habría que hacer algun calculo previamente al orden ascendente/desc..?

productos:
id_producto = 13
precio: 40000

descuentos:
id_producto = 13
descuento: 50

50% de descuento para el producto 13... osea el precio final es de 20000. en base al precio final deberia ordenar.

se entiende?
__________________
Rodrigo Lopez
  #4 (permalink)  
Antiguo 21/06/2009, 17:06
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, 5 meses
Puntos: 2658
Respuesta: ordenar por precio ascendente y descendente

¿Y cuál es el problema?
Simplemente usas la resultante del cálculo para ordernar, por medio de su alias. Los alias pueden usarse en GROUP BY y ORDER BY, pero no te olvides que no se pueden usar en el WHERE.
Código sql:
Ver original
  1. SELECT producto_id, descripcion, precio, ((precio * IFNULL(descuento,0))/100) condescuento
  2. FROM producto LEFT JOIN descuentos USING(producto_id)
  3. ORDER BY condescuento DESC, precio ASC, descripcion ASC;

No he probado el IFNULL funcionando sobre un cálculo así, pero no debería producir errores.
Si lo hace, hay que ponerlo en una subconsulta y listo:
Código sql:
Ver original
  1. SELECT producto_id, descripcion, precio, ((precio * descuento)/100) condescuento
  2. FROM (
  3.     SELECT producto_id, descripcion, precio, IFNULL(descuento,0)
  4.     FROM producto LEFT JOIN descuentos USING(producto_id)) T1
  5. ORDER BY condescuento DESC, precio ASC, descripcion ASC;
__________________
¿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 21/06/2009, 17:48
 
Fecha de Ingreso: diciembre-2002
Ubicación: arica 3334
Mensajes: 75
Antigüedad: 21 años, 4 meses
Puntos: 0
Respuesta: ordenar por precio ascendente y descendente

gracias, me sirvio bastante, pero me dio un problema con mostrar los productos unicamente con condicion visible=1
me está mostrando tambien los visible=0

Código:
SELECT productos.*, (precio-(precio * IFNULL(descuento,0))/100) condescuento 
FROM productos p LEFT JOIN ofertas USING(id_producto) 
WHERE p.visible='1' 
ORDER BY condescuento ASC
como puedes ver, calcule todos los precios con y sin descuento dejandolos en condescuento.
el problema, es que no me toma en cuenta el WHERE p.visible=1

me muestra tb los p.visible=0 y no debería :/... porque me pasa eso?
__________________
Rodrigo Lopez
  #6 (permalink)  
Antiguo 21/06/2009, 18:01
 
Fecha de Ingreso: diciembre-2002
Ubicación: arica 3334
Mensajes: 75
Antigüedad: 21 años, 4 meses
Puntos: 0
Respuesta: ordenar por precio ascendente y descendente

ya funciono!
muchas gracias. solo le di nombre a las tablas T y T1 y luego en where : T.visible=1

muchas gracias por todo :)
__________________
Rodrigo Lopez
  #7 (permalink)  
Antiguo 21/06/2009, 18:48
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, 5 meses
Puntos: 2658
Respuesta: ordenar por precio ascendente y descendente

Por nada. Para eso estamos por acá...

Saludos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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:16.