一、先说一下业务:
1、查询题干重复的试题id
2、重复的试题存在,查这些试题id下的选项是否相同
二、相关数据库:
1、试题表和选项表,对于单选多选等会在选项表里存选项内容
2、选项表里的选项内容字段是以json格式存放的,但由于json检索和插入太慢存的是longtext格式的json格式。
三、sql语句
1、返回题干id(这步sql很简单的,略了)
2、这些id下的选项是否和输入选项相同。
<select id="optionCheck" resultType="java.lang.String">
SELECT
question_id as questionId
FROM
`te_option`
WHERE
question_id in
<foreach collection="questionIdList" item="questionId" open="(" separator="," close=")" >
#{questionId,jdbcType=VARCHAR}
</foreach>
and
<foreach collection="optionList" item="option" separator="and">
JSON_CONTAINS ( option_json, JSON_OBJECT('optionName',#{option.optionName} ) )
</foreach>
and is_delete=0
</select>
实际执行的样子:
SELECT
question_id as questionId
FROM
`te_option`
WHERE
question_id in
(
'1195669323767631875'
,
'1195669419972382723'
)
and
JSON_CONTAINS ( option_json, JSON_OBJECT('optionName','这是答案A' ) )
and
JSON_CONTAINS ( option_json, JSON_OBJECT('optionName','这是答案B' ) )
and
JSON_CONTAINS ( option_json, JSON_OBJECT('optionName','这是答案E' ) )
and
JSON_CONTAINS ( option_json, JSON_OBJECT('optionName','这是答案D' ) )
先看第一个foreach:
1、是在括号里有多个参数,所以要open="("开始,close=")"结束,separator=","作为中间的分隔
2、因为参数是一维,只有一个string的字段,所以参数要写成#{questionId,jdbcType=VARCHAR}(后边一定别忘了写)
第二个foreach:
1、多个条件,不用开头和结尾,以and作为中间分隔
因为本人在这里走了很多坑,特此记录一下。