1,关于sql语句
问题:1,A表与主表有主外键关联关系,但是B表是和A表有关联关系,而不是和主表有关联关系,这种情况下,sql语句怎么写可以保证查询结果依然是正确的?
<select id="queryCoreStudentInfo" resultType="com.zhihuishu.virtualcourse.controller.vo.StudentVo">
SELECT
vt.TERM_NAME termName,
vc.CLASS_NAME className,
vs.STUDENT_ID studentId,
vs.CODE code,
vs.STUDENT_NAME studentName,
vs.PHONE_NUMBER phoneNumber,
vs.SCHOOL_ID schoolId
FROM
VC_STUDENT vs
left join VC_CLASS vc on vc.CLASS_ID = vs.CLASS_ID AND vc.IS_DELETE = 0
left join VC_TERM vt on vt.ID = vc.TERM_ID AND vt.ID =vs.TERM_ID AND vt.IS_DELETE = 0
left join VC_STUDENT_RECORD vsr on vsr.STUDENT_ID = vs.STUDENT_ID AND vsr.CLASS_ID = vc.CLASS_ID AND vsr.TERM_ID = vt.ID AND vsr.IS_DELETE = 0
left join VC_RECORD_MODEL vrm on vsr.ID = vrm.STUDENT_RECORD_ID AND vrm.IS_DELETE = 0
WHERE
vs.COURSE_ID = #{courseId}
<if test="termId != null">
AND vs.TERM_ID = #{termId}
</if>
<if test="keyWord != null and keyWord != ''">
AND (vs.CODE like concat('%',#{keyWord},'%')
OR vs.STUDENT_NAME like concat('%',#{keyWord},'%'))
</if>
<if test="hasRead!=null and hasRead == 1 ">
AND vsr.APPLY_GRADE_STATE = 1
AND vsr.REVIEW_STATUS = 0
</if>
<if test="hasGoodReport!=null and hasGoodReport == 1 ">
AND vrm.IS_EXCELLENT = 1
</if>
AND vs.IS_DELETE = 0
ORDER BY vc.TERM_ID DESC
LIMIT #{start},#{size}
</select>
在这个sql语句中,主表: VC_STUDENT vs,A表:VC_STUDENT_RECORD vsr,B表:VC_RECORD_MODEL vrm ,
此时,解决方法是:看这个sql,student表,
先关联了VC_CLASS表,所以on中写的是这两张表的关系,
然后又关联了VC_TERM表,所以on后面写的是VC_TERM表和前两张已经关联的表的关联关系。
然后又关联了VC_STUDENT_RECORD 表,所以on后面写的是VC_STUDENT_RECORD 表和前面的所有表有的所有关联关系。
然后又关联了VC_RECORD_MODEL 表,所以on后面写的是VC_RECORD_MODEL 表和前面已经关联的表的所有关联关系。
而且注意:每一个on后面都加了此表.IS_DELETE = 0,这种条件是可以写在on里面的,而主表的.IS_DELETE = 0写在了where条件语句里面。
这样写,sql的执行结果就可以是自己想要看到的效果。