MySQL中如何用LEFT JOIN关联两张表并保留NULL值
解决方案
你的思路核心是对的,但有两处需要调整:
- 查询字段不全:你当前的SELECT只返回了
project_key,没有包含time_spent字段,自然看不到NULL值的显示效果。 - 日期条件的位置:如果要准确判断项目在指定日期是否已创建,需要结合项目的创建时间(假设
projects表有created_date字段),并将日期条件放在JOIN的ON子句中,而非子查询里。
修正后的SQL(含项目创建时间判断)
假设projects表存在created_date字段记录项目创建日期,SQL如下:
SELECT p.project_key, d.time_spent FROM projects p LEFT JOIN data d ON p.project_key = d.project_key AND CAST(d.date_added AS DATE) = '2022-11-07' AND p.created_date <= '2022-11-07' -- 过滤出指定日期前已创建的项目
简化版SQL(无项目创建时间字段)
如果projects表没有记录创建时间,仅需返回所有项目在指定日期的data数据(无数据则显示NULL),可简化为:
SELECT p.project_key, d.time_spent FROM projects p LEFT JOIN data d ON p.project_key = d.project_key AND CAST(d.date_added AS DATE) = '2022-11-07'
逻辑说明
把日期匹配条件放在JOIN的ON子句中,LEFT JOIN会保留projects表的所有记录:
- 当
data表中存在对应项目且日期匹配的记录时,返回对应的time_spent值; - 当没有匹配记录(项目未创建或当天无数据)时,
time_spent自动显示为NULL。
你之前的子查询写法其实也能保留所有项目,但因为没查询time_spent字段,所以无法看到预期的NULL结果。
内容的提问来源于stack exchange,提问作者HectorB
相关产品推荐
相关产品推荐

