含INNER JOIN的MySQL查询指定timesheets ID无返回行求助
这种情况我之前也碰到过好几次——明明主表有数据,关联查询却返回空,核心原因基本都出在关联条件的匹配环节,咱们一步步来定位:
先确认关联字段的实际值
先单独查询timesheets表id=46的关联字段值,执行这条语句:SELECT teacher_id, school_id FROM timesheets WHERE id = 46;拿到结果后,分别去users和schools表验证是否存在对应记录:
-- 验证用户表是否有匹配 SELECT * FROM users WHERE id = [刚才查到的teacher_id]; -- 验证学校表是否有匹配 SELECT * FROM schools WHERE id = [刚才查到的school_id];INNER JOIN的规则是必须两边都有匹配记录才会返回结果,如果其中某张关联表没有对应id的记录,整个查询就会返回空。
检查字段类型是否一致
有时候数值看起来一样,但字段类型不匹配也会导致关联失败——比如timesheets的teacher_id是INT,但users的id是VARCHAR,哪怕数值都是123,类型不兼容也会匹配不上。你可以用DESCRIBE命令查看字段类型:DESCRIBE timesheets; DESCRIBE users; DESCRIBE schools;对比
teacher_id和users.id、school_id和schools.id的类型是否完全一致。排查NULL值问题
如果刚才查询到的teacher_id或school_id是NULL,那INNER JOIN肯定匹配不到任何记录(因为NULL和任何值都不相等)。这种情况下,如果你想保留主表的记录,哪怕关联表没有匹配数据,可以把INNER JOIN改成LEFT JOIN:SELECT * FROM timesheets t LEFT JOIN users u ON t.teacher_id = u.id LEFT JOIN schools s ON t.school_id = s.id WHERE t.id = 46;执行后如果users或schools的字段显示NULL,就说明是这张表没有匹配的记录。
用LEFT JOIN快速定位问题
直接把原查询的INNER JOIN换成LEFT JOIN,执行后看返回结果里users和schools的字段是否为NULL——哪个表的字段全是NULL,哪个就是导致无结果的原因。
内容的提问来源于stack exchange,提问作者ajgisme

