Mapper.xml中使用foreach

本文介绍了一种使用SQL技巧来检查数据库中重复试题的选项是否一致的方法。通过两个foreach循环,分别处理试题ID列表和选项列表,确保在进行选项比较时,能够准确地匹配到每一个试题的所有选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、先说一下业务:

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作为中间分隔

因为本人在这里走了很多坑,特此记录一下。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值