MySQL左连接查询:如何保留主表数据仅过滤关联表字段
解决MySQL LEFT JOIN后主表数据丢失问题
你的问题核心是关联表的过滤条件放错了位置:把ph.status的判断放在WHERE子句里,会直接过滤掉所有不满足该条件的行——包括主表原本存在但关联表无匹配数据的行,因为此时ph.status是NULL,和任何值比较都不成立,导致主表数据也被过滤了。
修改方案
把ph.status的条件从WHERE移到LEFT JOIN的ON子句中,这样只会过滤关联表的匹配行,不会影响主表数据的显示:
SELECT sv.loaded_by, sv.supervised_by, ph.extra_photo, ph.status FROM wla_loading_sv sv LEFT JOIN wla_extraPhoto ph ON sv.bl_id = ph.bl_id AND ph.status = 1 WHERE sv.bl_id = 4747
效果说明
- 当
ph.status=1时,关联表符合条件的行正常匹配显示,主表数据完整保留; - 当你需要查询
ph.status=0时,只需要把ON子句里的ph.status = 1改成ph.status = 0,此时主表数据依然全部显示,关联表中status不等于0的行对应的extra_photo和status字段会显示为NULL。
内容的提问来源于stack exchange,提问作者Ratu Batu Hamlo Koto
相关产品推荐
相关产品推荐

