Ver Mensaje Individual
  #4 (permalink)  
Antiguo 03/02/2015, 05:51
Avatar de gnzsoloyo
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: LEFT JOIN con condiciones en ambas columnas, sentencia algo compleja..

Vovlamos a esto que mencionas:
Cita:
Por lo tanto nos encontramos en esta situación, en la primera tabla tenemos los productos, y en la segunda los precios promocionales vinculados a esos productos. Puede ser que tenga 1 precio promocional y que este en vigor (la fecha actual este comprendida entre la fecha de inicio y fin), que tenga varios precios promocionales (aunque solo 1 en vigor), que no tenga ningun precio promocional y que por lo tanto ni aparezca en la tabla....

La única condición que controlo yo por programación es que NUNCA puede tener 2 precios promocionales en vigor al mismo tiempo. Al introducir uno, ese rango de fechas se anula y no se puede introducir ningún registro cuyas fechas contenga o este contenida por las fechas ya registradas.
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);
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)