Ver Mensaje Individual
  #5 (permalink)  
Antiguo 03/02/2015, 07:47
barbel
 
Fecha de Ingreso: septiembre-2012
Ubicación: Pontevedra
Mensajes: 48
Antigüedad: 11 años, 7 meses
Puntos: 2
Respuesta: LEFT JOIN con condiciones en ambas columnas, sentencia algo compleja..

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Vovlamos a esto que mencionas:

Según se entiende entonces:
  1. Todo producto tiene un precio base, ese precio se encuentra en la tabla de Productos.
  2. Cada producto puede tener cero (0) o muchos precios promocionales.
  3. Cada precio promocional sólo puede tener vigencia en un determinado período.
  4. No existen solapamientos de periodos en los precios promocionales.
  5. Necesitas que la consulta te devuelva el precio promocional vigente, o bien el precio base si no existe, para una fecha dada...

Si eso es correcto, la consulta tiene dos limitantes:
  • No puedes invocar la tabla en forma genérica, sino que debes indicar cada campo en forma específica.
  • El precio a obtener requiere la aplicación de funciones.
Código MySQL:
Ver original
  1. SELECT P.id ir_producto,
  2.   P.nombre,
  3.   IFNULL(PP.preciopromocional, P.precio) PrecioLista,
  4.   P.iva,
  5.   P.descripcion,
  6.   P.activo
  7. FROM productos P
  8. LEFT JOIN preciopromocional PP ON P.id = PP.idproducto
  9.     P.categoria = 1  AND
  10.     (CURDATE() BEWEEN PP.comienzo AND PP.fin
  11.     OR PP.idproducto IS NULL);
Tampoco me sirve, aunque es cierto, que la sentencia me ordena las cosas de manera mucho mejor me falla en el momento que un producto tiene un preciopromocional no activo. Es decir, (por ejemplo) el producto 5, tiene un registro en preciopromocional que comienza la semana que viene y termina dentro de 2 semanas. En ese caso no se cumplen las condiciones del WHERE ya que CURDATE() no esta entre comienzo y fin, y idproducto no es nulo (el registro existe solo que no esta en vigor). Asi que vuelve a pasarme lo mismo, al ejecutar esta sentencia me devuelve todos los productos que no tienen registro en preciopromocional, me devuelve todos los productos que tiene un preciopromocional activo actualmente (todo eso de manera perfecta), pero no me devuelve los productos que tienen un preciopromocional NO ACTIVO actualmente.

De nuevo otra vez, muchas gracias....

jamas pensé que podría complicarse tanto una sentencia