[英]left join with condition for right table in 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天的价格拉下来。
任何信息将不胜感激。
假设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函数删除时间部分,因为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)
上面的答案很强 添加到OMG Ponies的回复...在原始WHERE语句中具有'right'表标准基本上将LEFT OUTER JOIN转换为INNER JOIN。 只是以不同的方式看待它可能会有所帮助。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.