
当我们使用内连接查询固定级的父子节点数据的时候有个非常重要的点1.inner join teachplan two on two.parentid one.id的含义这个内连接的作用是one表代表父级教学计划一级节点two表代表子级教学计划二级节点连接条件two.parentid one.id表示只查询那些有子节点的父节点关键点INNER JOIN是内连接它只会返回两个表都能匹配上的记录。也就是说如果一个父节点的id在子节点的parentid中找不到对应记录这个父节点就不会被查询出来如果添加的父节点还没有子节点或者子节点的parentid没有正确设置为该父节点的id就查不出来2. 添加父节点为 0 的数据查不出来的原因问题分析1.inner join teachplan two on two.parentid one.id的含义这个内连接建立了父子关系one表代表父节点一级教学计划two表代表子节点二级教学计划连接条件two.parentid one.id表示只查询那些有子节点的父节点2.为什么添加父节点为 0 的数据查不出来whereone.parentid0andone.course_id#{id}问题的根本原因INNER JOIN 的特性内连接只会返回两个表都能匹配上的记录如果一个父节点one没有子节点two就不会出现在结果中即使父节点的parentid 0只要它没有子节点就查不出来业务场景当你新增一个父节点parentid 0grade 1时如果还没有为这个父节点添加子节点grade 2那么inner join就无法匹配到子节点记录结果就是这个父节点不会显示在查询结果中3.解决方案根据你的业务需求有两种解决方案方案 1改为 LEFT JOIN推荐如果你希望即使父节点没有子节点也能查询出来将 INNER JOIN 改为 LEFT JOINselectidselectTreeNodesparameterTypelongresultMaptreeNodeResultMapselect one.id one_id, one.pname one_pname, one.parentid one_parentid, one.grade one_grade, one.media_type one_mediaType, one.start_time one_stratTime, one.end_time one_endTime, one.orderby one_orderby, one.course_id one_courseId, one.course_pub_id one_coursePubId, two.id two_id, two.pname two_pname, two.parentid two_parentid, two.grade two_grade, two.media_type two_mediaType, two.start_time two_stratTime, two.end_time two_endTime, two.orderby two_orderby, two.course_id two_courseId, two.course_pub_id two_coursePubId, m1.media_fileName mediaFilename, m1.id teachplanMeidaId, m1.media_id mediaId from teachplan one left join teachplan two on two.parentid one.id left join teachplan_media m1 on two.id m1.teachplan_id where one.parentid 0 and one.course_id #{id} order by one.orderby,two.orderby/select修改说明这样即使父节点没有子节点也会查询出父节点信息子节点字段为 NULL方案 2保持 INNER JOIN但调整业务流程如果你的业务要求父节点必须有子节点才能显示那么保持现状即可。但需要在添加数据时先添加父节点然后立即添加至少一个子节点这样父节点就能查询出来了总结查不出来的原因使用了INNER JOIN要求父节点必须有对应的子节点新增的父节点还没有子节点所以无法匹配