最近在做公司项目,遇到一个棘手的问题,在根据试题id查询试题选项的时候需要查询他对应的关联的能力,但是如果没有在关联表中不存在选项和能力的关系,选项也会查询不出来。
有问题的sql:
SELECT
exam_options.id,
exam_options.QST_ID,
exam_options.OPT_CONTENT,
exam_options.OPT_ORDER,
exam_options.OPT_ANSWER,
exam_options.ADDTIME,
exam_options.OPT_ANALYZE,
exam_options.OPT_MASTER,
edu_question_ability_relation.id,
edu_question_ability_relation.abilityName,
edu_question_ability_relation.abilityId
FROM exam_options,edu_question_ability_relation
where
edu_question_ability_relation.optionId=exam_options.id
AND edu_question_ability_relation.questionId=exam_options.QST_ID
<if test="qstId!=null and qstId!=0">
AND exam_options.QST_ID = #{qstId}
</if>
修改后sql:
SELECT
exam_options.id,
exam_options.QST_ID,
exam_options.OPT_CONTENT,
exam_options.OPT_ORDER,
exam_options.OPT_ANSWER,
exam_options.ADDTIME,
exam_options.OPT_ANALYZE,
exam_options.OPT_MASTER,
edu_question_ability_relation.id,
edu_question_ability_relation.abilityName,
edu_question_ability_relation.abilityId
FROM exam_options,edu_question_ability_relation
where
edu_question_ability_relation.optionId=exam_options.id
AND
edu_question_ability_relation.questionId=exam_options.QST_ID
<if test="qstId!=null and qstId!=0">
AND exam_options.QST_ID = #{qstId}
</if>
对于入场不久的小白,其间经历了各种尝试,左连接也用过,还是不行,最后经过强大的百度,看别人写的代码,试了试才明白原来where和on不是一回事。
在使用left join时,on and和on where条件的区别如下(以下内容为复制):
1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉,on后的条件用来生成左右表关联的临时表,where后的条件对临时表中的记录进行过滤