<!--根据方向和ID修改顺序--> <update id="updateOrderByDirectionAndId"> update teachplan T1, # 先设置三个表用来更新和保存状态 teachplan T2, <if test="direction != null and direction == 'movedown'.toString()"> (SELECT id,orderby FROM teachplan T3 WHERE T3.course_id = #{teachplan.courseId} AND T3.orderby > #{teachplan.orderby} # 找到第一个比当前顺序大的行,和他的orderby进行就交换 AND T3.parentid = #{teachplan.parentid} ORDER BY T3.orderby limit 1) T4 </if> <if test="direction != null and direction == 'moveup'.toString()"> (SELECT id,orderby FROM teachplan T3 WHERE T3.course_id = #{teachplan.courseId} AND T3.orderby < #{teachplan.orderby} # 找到第一个比当前顺序小的行,和他的orderby进行就交换 AND T3.parentid = #{teachplan.parentid} ORDER BY T3.orderby desc # 注意此时是逆序 limit 1) T4 </if> SET T2.orderby = T1.orderby, T1.orderby = T2.orderby where T1.parentid = T2.parentid AND T1.course_id = T2.course_id AND T1.parentid = #{teachplan.parentid} AND T1.course_id = #{teachplan.courseId} AND T1.orderby = #{teachplan.orderby} AND T2.orderby = T4.orderby AND T1.id != T4.id; # 防止其再次更新自己,确保只更新目标的两行 </update>