欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-02 18:27:10
...

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 )

相关标签: foreach in