您现在的位置是:网站首页 > 代码编程 > 数据库数据库

【原】MySQL按照传入参数的顺序返回结果

不忘初心 不忘初心 2019-03-10 围观() 评论() 点赞() 数据库

简介:在做一个自动推荐系统的时候,碰到了一个问题,我传入我想做比对的tag,但是实际返回结果却不大对,一番追查下来,发现竟然是mysql返回结果集的时候,没有按照我传

在做一个自动推荐系统的时候,碰到了一个问题,我传入想做关联的tag,但是实际返回结果却不大对,一番追查下来,发现竟然是mysql返回结果集的时候,没有按照我传入参数的顺序,而是按照了ID从小到大的排列顺序,导致查询数据的时候,关联度最高的标签没有放在最前面。

查阅资料发现,mysql是允许指定这个返回参数顺序的,只不过要多加一个order by field (id, ....),现在用我的代码给大家演示一下这个问题。

mapper.xml映射文件:

<select id="gets" resultMap="resultMap">
    select
    <include refid="columns"/>
    from tag
    where deleted = 0 
    and id in 
    <foreach collection="ids" item="id" open="(" separator="," close=")">
    	#{id}
    </foreach>
</select>

mapper.java映射方法:

public Map<Integer, T> gets(Collection<Integer> ids) {
    if (CollectionUtils.isEmpty(ids)) {
        return null;
    }
    List<T> entitys = baseDao.gets(new LinkedHashSet<>(ids));
    if (CollectionUtils.isEmpty(entitys)) {
        return null;
    }
    Map<Integer, T> map = new LinkedHashMap<>();
    for (T entity : entitys) {
        map.put(entity.getId(), entity);
    }
    return map;
}

开始就是为了防止这个问题,我还特意写了一个LinkedHashSet来处理顺序,但是没想到问题出在了mysql身上。

查询结果:

MySQL按照传入参数的顺序返回结果

大家看到,我传入的顺序是倒序(我这里是碰巧,顺序可以随意打乱),但是返回的时候却变成了正序,导致我关联度最高的标签反而跑到后面去了,这影响可就大了,相当于自动推荐失败了。。。

加上order by field再来测试一下:

<select id="gets" resultMap="resultMap">
    select
    <include refid="columns"/>
    from tag
    where deleted = 0 
    and id in 
    <foreach collection="ids" item="id" open="(" separator="," close=")">
    	#{id}
    </foreach>
    order by field(
    id,
    <foreach collection="ids" item="id" open="" separator="," close="">
        #{id}
    </foreach>
    )
</select>

这个时候,查询的结果集就是按我指定的顺序来排列返回了!

MySQL按照传入参数的顺序返回结果

mysql

看完文章,有任何疑问,请加入群聊一起交流!!!

很赞哦! ()

文章评论

  • 请先说点什么
    人参与,条评论

请使用电脑浏览器访问本页面,使用手机浏览器访问本页面会导致下载文件异常!!!

雨落无影

关注上方公众号,回复关键字【下载】获取下载码

用完即删,每次下载需重新获取下载码

若出现下载不了的情况,请及时联系站长进行解决

站点信息

  • 网站程序:spring + freemarker
  • 主题模板:《今夕何夕》
  • 文章统计:篇文章
  • 标签管理标签云
  • 微信公众号:扫描二维码,关注我们