2010-10-23 52 views
7

我一直试图围绕这个问题包裹我的头,但我没有取得很大进展。我的目标是在两个表格之间进行左连接,并为右表创建条件。我希望看到当天所有产品和价格的列表,即使当前没有定价行。下面是代码示例:左加入条件为右表在mysql中

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

由此产生的不仅是产品与当前日期的价格信息。好的,这只是我问题的第一部分。我最终希望将CURRENT_DATE + INTERVAL 1天的价格也提高。

任何信息将不胜感激。

回答

9

PRICES.date假设是DATETIME数据类型,可使用:

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 

我用DATE function去除时间部分,因为CURRENT_DATE将不包括时间部分,而DATETIME记录将。

在此示例中,正在应用date标准之前 JOIN进行。它就像一个派生表,在建立JOIN之前将信息过滤掉 - 这将产生与在WHERE子句中指定标准不同的结果。

要获取产品和价格为明天的列表,使用:

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) 

参考:

如果你想同时今天和明天的价格在单查询,使用:

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

今天学到了新东西:) – almaruf 2015-08-11 09:21:07

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

上面的强答案。添加到OMG Ponies的回复中......在原始WHERE语句中使用'正确'表格标准基本上将LEFT OUTER JOIN变成INNER JOIN。只是以不同的方式看待它可能会有所帮助。