关于Mytatis动态拼接in语句并且按照指定顺序排序的问题

mysql在select的时候,如果where后面是in结构,查询出来的结果不会按in里面的数据顺序进行返回,而是有默认的排序。通常用到in的时候,是在update做批量更新的时候,这种情况不需要查询in结构里面的数据,所以不会出现数据紊乱的情况。但是,如果需要获取多条数据,并且这多条数据,在数据库中不是自然顺序的时候,select出来的数据会对查询出来的数据进行默认的排序,经自身的测试,应该是按照某字段的升序排序(测试不是很严谨,仅直观的感受)。比如用in(2,3,5,4,7,6,10,9,8)来查询数据(in结构中的数据是ID值),查询出来的结果顺序是以ID顺序2,3,4,5,6,7,8,9,10来返回的。如果程序中要对select出来的数据再进行处理,那在处理ID=5的时候,其实处理的是ID=4的记录数据,同样地,处理ID=4的时候,其实处理的是ID=5的数据,这样就把数据库ID=4的数据计算结果值给了程序中ID=5的情况。这样就出现了“张冠李戴”的现象。

解决办法:亲测都可行。

第一种:order by find_in_set(ID,'2,3,5,4,7,6,10,9,8')

例子:SELECT * from tb_check WHERE ID in (2,3,5,4,7,6,10,9,8) ORDER BY FIND_IN_SET(ID,'2,3,5,4,7,6,10,9,8')

第二种:order by substring_index('2,3,5,4,7,6,10,9,8',ID,1)

例子:SELECT * from tb_check WHERE ID in (2,3,5,4,7,6,10,9,8) ORDER BY SUBSTRING_INDEX('2,3,5,4,7,6,10,9,8',ID,1)

第三种:order by field

SELECT * from tb_check WHERE ID in (2,3,5,4,7,6,10,9,8) ORDER BY FIELD(ID,2,3,5,4,7,6,10,9,8)(注意:这里没有单引号)

上述为摘选,选择第一种和第三种做的动态拼接测试,最终第一种失败了,无论怎样动态拼接单引号内的内容时总是解析失败,只有第三种成功了。不知如何实现引号内的foreach动态拼接。

第三种的拼接方式如下:

    <select id="selectCircleList" resultMap="BaseResultMap">
        select <include refid="Base_Column_List"></include> from sns_circle
        where id in
        <foreach collection="ids" item="id" index="index" open="(" close=")" separator=",">
            #{id}
        </foreach>
        order by field ( id,
        <foreach collection="ids" item="id" index="index" open="" close="" separator=",">
            #{id}
        </foreach>
        )
    </select>

最终SQL:select * from sns_circle where id in ( 4 , 3 , 2 , 1 ) order by field ( id, 4 , 3 , 2 , 1 )

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值