2010-10-23 7 views
7

He estado tratando de entender este problema pero no estoy progresando mucho. Mi objetivo es hacer una combinación a la izquierda entre dos tablas con criterios para la tabla correcta. Me gustaría ver la lista de todos los productos y precios del día actual, aunque no haya una fila de precios para el día actual. Aquí hay un ejemplo del código:left join con la condición para la tabla correcta en mysql

SELECT products.id, products.name, prices.price 
FROM products LEFT JOIN prices 
ON products.id = prices.id 
WHERE prices.date = CURRENT_DATE 

Esto produce solo los productos con información de precios para la fecha actual.

Bien, esa es solo la primera parte de mi problema. Finalmente me gustaría obtener el precio para CURRENT_DATE + INTERVAL 1 DAY también.

Cualquier información sería muy apreciada.

Respuesta

9

Suponiendo PRICES.date está un tipo de datos DATETIME, utilizar:

SELECT pd.id, 
      pd.name, 
      pr.price 
    FROM PRODUCTS pd 
LEFT JOIN PRICES pr ON pr.id = pd.id 
        AND DATE(pr.date) = CURRENT_DATE 

he utilizado la DATE function para eliminar la porción de tiempo, porque CURRENT_DATE no incluirá la parte de tiempo, mientras que los registros DATETIME hará.

En este ejemplo, se aplica el criterio dateantes de se realiza la UNIÓN. Es como una tabla derivada, que filtra la información antes de que se realice el JOIN, lo que arrojará resultados diferentes a los especificados en la cláusula WHERE.

Para obtener la lista de productos y precios de mañana, utilice:

SELECT pd.id, 
      pd.name, 
      pr.price 
    FROM PRODUCTS pd 
LEFT JOIN PRICES pr ON pr.id = pd.id 
        AND DATE(pr.date) = DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY) 

Referencia:

Si se desea que ambas del día de hoy y los precios del mañana en un solo consulta, use:

SELECT pd.id, 
      pd.name, 
      pr1.price AS price_today, 
      pr2.price AS price_tomorrow 
    FROM PRODUCTS pd 
LEFT JOIN PRICES pr1 ON pr1.id = pd.id 
        AND DATE(pr1.date) = CURRENT_DATE 
LEFT JOIN PRICES pr2 ON pr2.id = pd.id 
        AND DATE(pr2.date) = DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY) 
+0

aprendí algo nuevo hoy :) – almaruf

1
SELECT id, 
     name, 
     (SELECT price 
      FROM prices 
     WHERE id = products.id 
      AND prices.date = CURRENT_DATE 
     ) AS price, 
     (SELECT price 
      FROM prices 
     WHERE id = products.id 
      AND prices.date = DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY) 
     ) AS price_tomorrow 
    FROM products 
5

Respuestas fuertes arriba. Añadiendo a la respuesta de Ponies de OMG ... tener los criterios de tabla "correcta" en la declaración WHERE original, básicamente convierte a la UNIÓN EXTERIOR IZQUIERDA en una UNIÓN INTERNA. Solo una forma diferente de mirarlo podría ayudar.