在mysql中使用右表的条件左连接

时间:2010-10-23 04:03:28

标签: sql mysql left-join

我一直试图解决这个问题,但我没有取得多大进展。我的目标是在两个表之间进行左连接,并使用右表的标准。我想查看当天所有产品和价格的清单,即使当天没有定价行。以下是代码示例:

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 DAY 的价格。

非常感谢任何信息。

3 个答案:

答案 0 :(得分:10)

假设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记录时不会包含时间部分。

在此示例中,在进行JOIN之前,已应用date条件。它就像一个派生表,在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)

答案 1 :(得分:6)

以上强有力的答案。添加到OMG Ponies的回复...在原始WHERE语句中具有'right'表标准基本上将LEFT OUTER JOIN转换为INNER JOIN。只是以不同的方式看待它可能有所帮助。

答案 2 :(得分: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